2016-11-19 137 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

如果數據沒有改變,那麼硬編碼到源文件中。

如果您需要更改數據以進行測試或維護,則應將數據放入文件中。

不要擔心執行速度,直到有人抱怨。將精力集中在強大且易於閱讀的代碼上。用於應用程序的大部分時間都在維護中。如果你的代碼易於維護,你將花更少的時間來維護它。