2016-11-19 122 views
1

我想在字符串数组中存储多行文本(文本总是相同)。我能想到的2种方式这样:将文本读入字符串vs直接初始化文本字符串

方式一:

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中使用字符串s?我想这样做,因为我不希望我的source.cpp从所有这些初始化行中弄乱。

+0

“*哪种方式更快/更好?*”更快/更好的方式?你觉得这些字符串会多久改变一次?你需要在应用程序运行时更改字符串吗? –

+0

在整个应用程序的运行过程中,这些字符串将保持不变。根据用户的输入,我只能访问其中的20-30个(每个一次)。 我对哪种方法在更短的时间内执行感兴趣。 –

+0

还有第三种选择,使用'std :: vector'而不是固定容量的数组。 –

回答

0

在事物的宏伟计划中,只有500个相对较短的字符串,哪种方法更好,主要是一个学术问题,几乎没有实际区别。

但是,如果想要挑剔,从文件中读取它需要在运行时多一点工作,而不仅仅是立即初始化字符串数组。此外,您必须准备初始化文件丢失的可能性,并以某种方式处理该可能性。

将初始字符串值作为代码的一部分进行编译可避免需要执行某些错误处理并节省一点时间。最大的胜利将是缺乏处理初始化文件丢失的可能性的需要。事情可能出错的可能性与可能出错的事情的实际数量之间存在直接关系。

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纳秒)

所以,我的建议是:没有过早优化。在关注性能之前,关注功能(轻松定制内容)和可维护性(例如,如果软件使用多种语言,则易于本地化)。

0

如果数据没有改变,那么硬编码到源文件中。

如果您需要更改数据以进行测试或维护,则应将数据放入文件中。

不要担心执行速度,直到有人抱怨。将精力集中在强大且易于阅读的代码上。用于应用程序的大部分时间都在维护中。如果你的代码易于维护,你将花更少的时间来维护它。