SSD6中Exercise4 (substitute.cpp) 答案解析
今天终于把Exercise4搞定了,昨天大约优化了0.38秒,今天优化了0.52秒,跨越了一大步。
在我们未加任何修饰执行此代码时,其执行后所用时间如图(摘抄主要):
Function | Callee Exclusive Time |
main | 1.495306 |
IndexOf( String, int32 ) |
0.771013 |
insertChar( String, int32, String, int32 ) | 0.444054 |
我们发现insertChar()函数里面就一条return语句,这完全没必要,何必还调用一个函数呢,申请栈释放栈很浪费时间,然后我们去掉这个函数,直接在别的函数里面用它里面的语句。
我们再来看
- for (int i = 0; i < replacement->Length; i++) {
- data = insertChar(data, loc+i, replacement, i);
- // data->Insert(loc + i, replacement->Substring(i, 1));
- }
这个也没必要,何必一个一个的插入呢?整体插入就算了。因而可以改为
- return data->Insert(loc,replacement);
对于indeof函数,占的时间实在太多,是该解决一下它,在原函数中间是这样的:
- for (loc = data->IndexOf(pattern, 0); loc >= 0;
- loc = data->IndexOf(pattern, 0)) {
- // replace word
- data = replace_word(data, loc, pattern->Length, replacement);
- }
没必要总是从第一个找起吧!起先我想的是从上一次查找的结束的下一个位置开始查找,但这样有一个问题。例如我们用dd替换cd,有一个字符串为cccd,第一次替换后为ccdd,不应该只是往后找,因为此时前面也出现了cd,故而在这里我们可以从新得到的loc 前 pattern->length处开始查找,再往前开始找没意义。在这里还就是pattern->Length最好在外面用一个变量代替,如pl,放置循环次次都计算pattern->Length(你可能认为编译器足够聪明,但我们不敢保证它在这里“敢”优化,毕竟pattern是个指针,随时可以变,还是我们替他提早优化,参考《深入理解计算机系统》)。
故而这段程序改为:
- int location = 0;
- int pl = pattern->Length;
- // find every occurrence of pattern:
- for (loc = data->IndexOf(pattern, 0); loc >= 0;
- loc = data->IndexOf(pattern, location)) {
- // replace word
- int dis = loc - pl;
- if (dis >= 0)
- {
- location = dis;
- }
- else
- {
- location = 0;
- }
- data = replace_word(data, loc, pl, replacement);
改过的程序为:
- #include <iostream>
- using namespace std;
- using namespace System;
- using namespace System::IO;
- using namespace System::Text;
- //String* insertChar(String *data, int loc, String *replacement, int i) {
- // return data->Insert(loc, replacement->Substring(i, 1));
- //}
- String* replace_word(String* data, int loc, int length, String* replacement) {
- // delete the pattern string from loc:
- data = data->Remove(loc, length);
- // insert each character of the replacement string:
- //for (int i = 0; i < replacement->Length; i++) {
- // data = insertChar(data, loc+i, replacement, i);
- // // data->Insert(loc + i, replacement->Substring(i, 1));
- //}
- return data->Insert(loc,replacement);
- //->Insert(loc,replacement)
- }
- String* string_subst(String *data, String *pattern, String *replacement) {
- try {
- int loc;
- int location = 0;
- int pl = pattern->Length;
- // find every occurrence of pattern:
- for (loc = data->IndexOf(pattern, 0); loc >= 0;
- loc = data->IndexOf(pattern, location)) {
- // replace word
- int dis = loc - pl;
- if (dis >= 0)
- {
- location = dis;
- }
- else
- {
- location = 0;
- }
- data = replace_word(data, loc, pl, replacement);
- }
- return data;
- } catch (Exception *e) {
- Console::WriteLine("Error in substitute ");
- Console::WriteLine(e->ToString());
- return data;
- }
- }
- String* batch_subst(String *data, const char* subs_filename) {
- try {
- String *subs_file = new String(subs_filename);
- StreamReader *subs_reader = new StreamReader(subs_file);
- String *pattern, *replacement, *separator;
- while (subs_reader->Peek() >= 0) {
- pattern = subs_reader->ReadLine();
- replacement = subs_reader->ReadLine();
- separator = subs_reader->ReadLine();
- data = string_subst(data, pattern, replacement);
- }
- return data;
- } catch(Exception* e ) {
- Console::WriteLine( "Error in do_substitutions ");
- Console::WriteLine( e->ToString());
- return data;
- }
- }
- void process_file(const char* filename, const char* subs_filename) {
- StreamReader *reader;
- StreamWriter *writer;
- String *file = new String(filename);
- try {
- reader = new StreamReader( file );
- String *data = reader->ReadToEnd();
- data = batch_subst(data, subs_filename);
- reader->Close();
- // write the data
- writer = new StreamWriter(file, false);
- writer->Write(data);
- writer->Close();
- } catch(Exception* e) {
- Console::WriteLine( "Error while processing file ");
- Console::WriteLine( e->ToString());
- }
- }
- int main(int argc, char *argv[]) {
- if (argc < 3) {
- cout << "Not enough input arguments" << endl;
- cout << "Usage: substitute subs-file src1 src2 ..." << endl;
- } else {
- for (int i = 2; i < argc; i++) {
- process_file(argv[i], argv[1]);
- }
- }
- return 0;
- }
我还准备优化那个reader->Close();writer->Close();没必要每次都关闭。但尝试了一下,最终失败。希望看过此文章的人不吝赐教,多多指导,共同学习。
转载于:https://www.cnblogs.com/null00/archive/2008/12/01/2065099.html
SSD6中Exercise4 (substitute.cpp) 答案解析相关推荐
- 计算机网络通信中常用的检错码,4月全国高等教育自学考试计算机网络与通信试题及答案解析...
<4月全国高等教育自学考试计算机网络与通信试题及答案解析>由会员分享,可在线阅读,更多相关<4月全国高等教育自学考试计算机网络与通信试题及答案解析(4页珍藏版)>请在人人文库网 ...
- 汾阳市教师招聘中职计算机真题,2019年山西省吕梁市汾阳市中小学语文教师招聘/编制考试历年真题试卷及答案解析...
2019年山西省吕梁市汾阳市中小学语文教师招聘/编制考试历年真题试卷及答案解析 1.下列句子中属于被动句的是( ) A.蔡泽见逐于赵. B.蔡泽者,燕人也. C.孰与秦孝公.楚悼王.越王乎 ...
- 将123倒转 c语言,中国航信杯C语言程序设计答案解析版.doc
中国航信杯C语言程序设计答案解析版 2 - 1 - 25 - (比赛科目:C语言程序设计) 软件要求与硬件要求 软件要求 WinTC(版本:V1.9.1) Dev C++(版本:4.9) Visual ...
- c语言程序设计中北答案详解,C语言程序设计试题及答案解析汇编.doc
C语言程序设计试题及答案解析汇编 C语言程序设计试题 第1.2.3章 概述.类型.表达式 一.选择题 一个C程序由若干个C函数组成,各个函数在文件中的位置顺序为:( ) 任意 第一个函数必须是主函数, ...
- 计算机网络中集成性和交互性,【计算机类职业资格】一级B笔试-366及答案解析.doc...
[计算机类职业资格]一级B笔试-366及答案解析.doc 一级 B 笔试-366 及答案解析总分100.00,做题时间90 分钟一.选择题总题数20,分数20.001.计算机系统采用总线结构对存储器和 ...
- 消防中计算机基础知识,消防设施操作员基础知识计算机基础知识真题及答案解析.doc...
消防设施操作员基础知识计算机基础知识真题及答案解析 模块八计算机基础知识 第1节 项目1 计算机系统的组成与功能 单选题(江南博哥) 1.()是计算机的核心部分. 输入设备 存储器 中央处理器 主板 ...
- 计算机网络中www中文名称为,计算机等级考试试题及答案解析(网络知识) -备考资料...
网络知识 1.在INTERNET中"WWW"的中文名称是:( ), A.广域网 B.局域网 C.企业网 D.万维网 D 2.在计算机网络中,数据资源共享指的是( ). A.应用程序 ...
- 下列计算机应用中属于计算机辅助教学的事,2017年计算机基础考试题库完整版「附答案解析」...
2017年计算机基础考试题库完整版「附答案解析」 [解析]计算机编程语言有:机器语言.汇编语言.高级语言.其中机器语言(由二进制码组成)是计算机能直接识别或执行的,而另两种语言则需要先翻译(又称为编译 ...
- C语言答案解析,C语言题库带详细讲解答案解析.doc
C语言题库带详细讲解答案解析.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3. ...
最新文章
- 【视频课】图像分割最新内容来了(言有三新录制6大理论部分+1个案例实践讲解)...
- curl封装php,PHP封装curl的简单方法
- linux下ffmpeg编译成so文件,一、ffmpeg编译成android使用的so库
- 6间企业获颁“首届粤港澳大湾区百强企业传承大奖”
- Dell’Oro 5年期数据中心报告预测25G/100G端口速率市场快速上升
- 分类器交叉验证java_使用交叉验证和F1分数选择SVM参数
- 大牛揭秘:如何快速在阿里云搭建视频直播平台
- 中划线与下划线的区别
- 怎么用注册表来删除卸载程序
- 2013年1月CPU性能天梯图
- GDPR对ITSM的影响
- python求梅森尼数_谈谈梅森旋转:算法及其爆破
- 计算机论文的摘要和关键词是什么意思,论文中的摘要和关键词是什么
- 谷歌自研芯片Tensor重磅来袭:“机器学习的里程碑”
- 无人驾驶汽车系统入门(十九)——分层有限状态机和无人车行为规划
- 《流畅的python》1.2 笔记
- 易语言程序加密的原则
- JAVA 版多商家入驻 直播带货 商城系统 B2B2C 商城源码之 B2B2C 产品概述
- 忘了什么,都请别忘了音乐
- KVM虚拟化基础原理
热门文章
- python2 md5加密_Python的加密方式:MD5加密
- Tokenisation word segmentation sentence segmentation
- 借贷平台Liquity昨日共有超300个Troves被清算
- 多链NFT市场Polkarare获加密投资机构DFG战略投资
- 跨链协议 ChainSwap 将于今晚 9 点在 Uniswap 上进行代币 TOKEN 的 LBP
- 观点:比特币新一轮突破“即将到来”
- 以太坊上DeFi协议总锁仓量突破190亿美元
- 英国央行:稳定币讨论文件将讨论与央行数字货币概念相关可能出现的问题
- SAP License:学习到底学什么?
- 风控小白入门 | 关于评分模型验证的7大问题回答