今天终于把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语句,这完全没必要,何必还调用一个函数呢,申请栈释放栈很浪费时间,然后我们去掉这个函数,直接在别的函数里面用它里面的语句。

我们再来看

  1. for (int i = 0; i < replacement->Length; i++) {
  2. data = insertChar(data, loc+i, replacement, i);
  3. // data->Insert(loc + i, replacement->Substring(i, 1));
  4. }

这个也没必要,何必一个一个的插入呢?整体插入就算了。因而可以改为

  1. return data->Insert(loc,replacement);

对于indeof函数,占的时间实在太多,是该解决一下它,在原函数中间是这样的:

  1. for (loc = data->IndexOf(pattern, 0); loc >= 0;
  2. loc = data->IndexOf(pattern, 0)) {
  3. // replace word
  4. data = replace_word(data, loc, pattern->Length, replacement);
  5. }

没必要总是从第一个找起吧!起先我想的是从上一次查找的结束的下一个位置开始查找,但这样有一个问题。例如我们用dd替换cd,有一个字符串为cccd,第一次替换后为ccdd,不应该只是往后找,因为此时前面也出现了cd,故而在这里我们可以从新得到的loc 前 pattern->length处开始查找,再往前开始找没意义。在这里还就是pattern->Length最好在外面用一个变量代替,如pl,放置循环次次都计算pattern->Length(你可能认为编译器足够聪明,但我们不敢保证它在这里“敢”优化,毕竟pattern是个指针,随时可以变,还是我们替他提早优化,参考《深入理解计算机系统》)。

故而这段程序改为:

  1. int location = 0;
  2. int pl = pattern->Length;
  3. // find every occurrence of pattern:
  4. for (loc = data->IndexOf(pattern, 0); loc >= 0;
  5. loc = data->IndexOf(pattern, location)) {
  6. // replace word
  7. int dis = loc - pl;
  8. if (dis >= 0)
  9. {
  10. location = dis;
  11. }
  12. else
  13. {
  14. location = 0;
  15. }
  16. data = replace_word(data, loc, pl, replacement);

改过的程序为:

  1. #include <iostream>
  2. using namespace std;
  3. using namespace System;
  4. using namespace System::IO;
  5. using namespace System::Text;
  6. //String* insertChar(String *data, int loc, String *replacement, int i) {
  7. //  return data->Insert(loc, replacement->Substring(i, 1));
  8. //}
  9. String* replace_word(String* data, int loc, int length, String* replacement) {
  10. // delete the pattern string from loc:
  11. data = data->Remove(loc, length);
  12. // insert each character of the replacement string:
  13. //for (int i = 0; i < replacement->Length; i++) {
  14. //  data = insertChar(data, loc+i, replacement, i);
  15. //  // data->Insert(loc + i, replacement->Substring(i, 1));
  16. //}
  17. return data->Insert(loc,replacement);
  18. //->Insert(loc,replacement)
  19. }
  20. String* string_subst(String *data, String *pattern, String *replacement) {
  21. try {
  22. int loc;
  23. int location = 0;
  24. int pl = pattern->Length;
  25. // find every occurrence of pattern:
  26. for (loc = data->IndexOf(pattern, 0); loc >= 0;
  27. loc = data->IndexOf(pattern, location)) {
  28. // replace word
  29. int dis = loc - pl;
  30. if (dis >= 0)
  31. {
  32. location = dis;
  33. }
  34. else
  35. {
  36. location = 0;
  37. }
  38. data = replace_word(data, loc, pl, replacement);
  39. }
  40. return data;
  41. } catch (Exception *e) {
  42. Console::WriteLine("Error in substitute ");
  43. Console::WriteLine(e->ToString());
  44. return data;
  45. }
  46. }
  47. String* batch_subst(String *data, const char* subs_filename) {
  48. try {
  49. String *subs_file = new String(subs_filename);
  50. StreamReader *subs_reader = new StreamReader(subs_file);
  51. String *pattern, *replacement, *separator;
  52. while (subs_reader->Peek() >= 0) {
  53. pattern = subs_reader->ReadLine();
  54. replacement = subs_reader->ReadLine();
  55. separator = subs_reader->ReadLine();
  56. data = string_subst(data, pattern, replacement);
  57. }
  58. return data;
  59. } catch(Exception* e ) {
  60. Console::WriteLine( "Error in do_substitutions ");
  61. Console::WriteLine( e->ToString());
  62. return data;
  63. }
  64. }
  65. void process_file(const char* filename, const char* subs_filename) {
  66. StreamReader *reader;
  67. StreamWriter *writer;
  68. String *file = new String(filename);
  69. try {
  70. reader = new StreamReader( file );
  71. String *data = reader->ReadToEnd();
  72. data = batch_subst(data, subs_filename);
  73. reader->Close();
  74. // write the data
  75. writer = new StreamWriter(file, false);
  76. writer->Write(data);
  77. writer->Close();
  78. }  catch(Exception* e) {
  79. Console::WriteLine( "Error while processing file ");
  80. Console::WriteLine( e->ToString());
  81. }
  82. }
  83. int main(int argc, char *argv[]) {
  84. if (argc < 3) {
  85. cout << "Not enough input arguments" << endl;
  86. cout << "Usage: substitute subs-file src1 src2 ..." << endl;
  87. } else {
  88. for (int i = 2; i < argc; i++) {
  89. process_file(argv[i], argv[1]);
  90. }
  91. }
  92. return 0;
  93. }

我还准备优化那个reader->Close();writer->Close();没必要每次都关闭。但尝试了一下,最终失败。希望看过此文章的人不吝赐教,多多指导,共同学习。

转载于:https://www.cnblogs.com/null00/archive/2008/12/01/2065099.html

SSD6中Exercise4 (substitute.cpp) 答案解析相关推荐

  1. 计算机网络通信中常用的检错码,4月全国高等教育自学考试计算机网络与通信试题及答案解析...

    <4月全国高等教育自学考试计算机网络与通信试题及答案解析>由会员分享,可在线阅读,更多相关<4月全国高等教育自学考试计算机网络与通信试题及答案解析(4页珍藏版)>请在人人文库网 ...

  2. 汾阳市教师招聘中职计算机真题,2019年山西省吕梁市汾阳市中小学语文教师招聘/编制考试历年真题试卷及答案解析...

    2019年山西省吕梁市汾阳市中小学语文教师招聘/编制考试历年真题试卷及答案解析 1.下列句子中属于被动句的是(    ) A.蔡泽见逐于赵.    B.蔡泽者,燕人也. C.孰与秦孝公.楚悼王.越王乎 ...

  3. 将123倒转 c语言,中国航信杯C语言程序设计答案解析版.doc

    中国航信杯C语言程序设计答案解析版 2 - 1 - 25 - (比赛科目:C语言程序设计) 软件要求与硬件要求 软件要求 WinTC(版本:V1.9.1) Dev C++(版本:4.9) Visual ...

  4. c语言程序设计中北答案详解,C语言程序设计试题及答案解析汇编.doc

    C语言程序设计试题及答案解析汇编 C语言程序设计试题 第1.2.3章 概述.类型.表达式 一.选择题 一个C程序由若干个C函数组成,各个函数在文件中的位置顺序为:( ) 任意 第一个函数必须是主函数, ...

  5. 计算机网络中集成性和交互性,【计算机类职业资格】一级B笔试-366及答案解析.doc...

    [计算机类职业资格]一级B笔试-366及答案解析.doc 一级 B 笔试-366 及答案解析总分100.00,做题时间90 分钟一.选择题总题数20,分数20.001.计算机系统采用总线结构对存储器和 ...

  6. 消防中计算机基础知识,消防设施操作员基础知识计算机基础知识真题及答案解析.doc...

    消防设施操作员基础知识计算机基础知识真题及答案解析 模块八计算机基础知识 第1节 项目1 计算机系统的组成与功能 单选题(江南博哥) 1.()是计算机的核心部分. 输入设备 存储器 中央处理器 主板 ...

  7. 计算机网络中www中文名称为,计算机等级考试试题及答案解析(网络知识) -备考资料...

    网络知识 1.在INTERNET中"WWW"的中文名称是:( ), A.广域网 B.局域网 C.企业网 D.万维网 D 2.在计算机网络中,数据资源共享指的是( ). A.应用程序 ...

  8. 下列计算机应用中属于计算机辅助教学的事,2017年计算机基础考试题库完整版「附答案解析」...

    2017年计算机基础考试题库完整版「附答案解析」 [解析]计算机编程语言有:机器语言.汇编语言.高级语言.其中机器语言(由二进制码组成)是计算机能直接识别或执行的,而另两种语言则需要先翻译(又称为编译 ...

  9. C语言答案解析,C语言题库带详细讲解答案解析.doc

    C语言题库带详细讲解答案解析.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3. ...

最新文章

  1. 【视频课】图像分割最新内容来了(言有三新录制6大理论部分+1个案例实践讲解)...
  2. curl封装php,PHP封装curl的简单方法
  3. linux下ffmpeg编译成so文件,一、ffmpeg编译成android使用的so库
  4. 6间企业获颁“首届粤港澳大湾区百强企业传承大奖”
  5. Dell’Oro 5年期数据中心报告预测25G/100G端口速率市场快速上升
  6. 分类器交叉验证java_使用交叉验证和F1分数选择SVM参数
  7. 大牛揭秘:如何快速在阿里云搭建视频直播平台
  8. 中划线与下划线的区别
  9. 怎么用注册表来删除卸载程序
  10. 2013年1月CPU性能天梯图
  11. GDPR对ITSM的影响
  12. python求梅森尼数_谈谈梅森旋转:算法及其爆破
  13. 计算机论文的摘要和关键词是什么意思,论文中的摘要和关键词是什么
  14. 谷歌自研芯片Tensor重磅来袭:“机器学习的里程碑”
  15. 无人驾驶汽车系统入门(十九)——分层有限状态机和无人车行为规划
  16. 《流畅的python》1.2 笔记
  17. 易语言程序加密的原则
  18. JAVA 版多商家入驻 直播带货 商城系统 B2B2C 商城源码之 B2B2C 产品概述
  19. 忘了什么,都请别忘了音乐
  20. KVM虚拟化基础原理

热门文章

  1. python2 md5加密_Python的加密方式:MD5加密
  2. Tokenisation word segmentation sentence segmentation
  3. 借贷平台Liquity昨日共有超300个Troves被清算
  4. 多链NFT市场Polkarare获加密投资机构DFG战略投资
  5. 跨链协议 ChainSwap 将于今晚 9 点在 Uniswap 上进行代币 TOKEN 的 LBP
  6. 观点:比特币新一轮突破“即将到来”
  7. 以太坊上DeFi协议总锁仓量突破190亿美元
  8. 英国央行:稳定币讨论文件将讨论与央行数字货币概念相关可能出现的问题
  9. SAP License:学习到底学什么?
  10. 风控小白入门 | 关于评分模型验证的7大问题回答