我想在一个字符串数组中存储多行文本(文本总是相同的)。我可以想到两种方法:
一种方式:
string s[100]={"first_line","second_line",...,"100th_line"};
另一种方式是
string s[100];
fstream fin("text.txt");
for (int i = 0; i < 100; i++)
fin.getline(s[i]);
的text.txt:
first_line
second_line
...
100th_line
实际行数约为500,每行的长度为50-60个字符。
所以我的问题是:哪种方式更快/更好?
L.E。:如何将第一个方法中的文本放在另一个文件中,仍然可以在source.cpp中使用字符串?我想这样做,因为我不希望我的source.cpp从所有这些初始化行中弄得乱七八糟。
答案 0 :(得分:2)
这里有一些 latency number every programmer should know :
memory read from cache: 0.5-7 nanoseconds
memory read from main memory: 100 nanoseconds
SSD disk access: 150 000 nanoseconds (reach location to read)
Hard disk access : 10 000 000 nanoseconds (reach location to read)
那对你来说最快的是什么?
第一个版本总是更快:文本与可执行文件一起加载(无访问开销),字符串对象在内存中构建(请参阅汇编代码online)。
第二个版本需要多次磁盘访问(至少打开当前目录,并访问该文件),一些操作系统操作(例如访问控制),不要忘记缓冲内存中的输入。只有这样才能在内存中创建字符串对象,就像在第一个版本中一样。
幸运的是,用户没有注意到纳秒,并且可能没有意识到差异:人眼需要13 ms to identify an image并且从眼睛到鼠标的反应时间大约为215 ms(215 000 000纳秒)< / p>
所以,我的建议是:没有过早优化。在深入了解性能之前,关注功能(容易定制内容)和可维护性(例如,如果软件在多种语言中使用,则易于本地化)。
答案 1 :(得分:0)
在宏观方案中,只有500个相对较短的字符串,哪种方法更好,主要是学术问题,几乎没有实际差异。
但是,如果一个人想要挑剔,那么从文件中读取它需要在运行时稍微多一些工作而不是立即初始化字符串数组。此外,您必须为初始化文件丢失的可能性做好准备,并以某种方式处理这种可能性。
作为代码的一部分编译初始字符串值避免了进行某些错误处理的需要,并节省了一点时间。最大的胜利是缺乏处理初始化文件丢失的可能性。可能出现问题的可能性与可能出错的实际数量之间存在直接关系。
答案 2 :(得分:0)
我会选择第一个,因为它直接在数组内部构造字符串,这实际上是安装(或者可能它移动它们,如果是这样我可能是错的),没有任何更多的操作,所以它可能很多比从硬盘读取然后执行与第一种方法相同的过程更好。
答案 3 :(得分:0)
如果数据没有改变,则将其硬编码到源文件中。
如果您需要更改数据,进行测试或维护,则应将数据放入文件中。
在有人抱怨之前,不要担心执行速度。专注于强大且易于阅读的代码。应用程序花费的大部分时间都在维护中。如果您使代码易于维护,您将花费更少的时间来维护它。