C ++標(biāo)準(zhǔn)是否要求iostream的性能不佳,或者我只是處理糟糕的實(shí)現(xiàn)?每當(dāng)我提到C ++標(biāo)準(zhǔn)庫iostream的慢性能時,我都會遇到一陣難以置信的風(fēng)潮。然而,我有剖析器結(jié)果顯示在iostream庫代碼中花費(fèi)了大量時間(完全編譯器優(yōu)化),并且從iostream切換到特定于操作系統(tǒng)的I / O API和自定義緩沖區(qū)管理確實(shí)提供了一個數(shù)量級的改進(jìn)。C ++標(biāo)準(zhǔn)庫做了多少額外工作,標(biāo)準(zhǔn)是否需要它,它在實(shí)踐中是否有用?或者有些編譯器提供了與手動緩沖區(qū)管理競爭的iostream實(shí)現(xiàn)嗎?基準(zhǔn)為了解決問題,我編寫了幾個簡短的程序來練習(xí)iostreams內(nèi)部緩沖:將二進(jìn)制數(shù)據(jù)放入ostringstream http://ideone.com/2PPYw將二進(jìn)制數(shù)據(jù)放入char[]緩沖區(qū)http://ideone.com/Ni5ctvector<char>使用http://ideone.com/Mj2Fi將二進(jìn)制數(shù)據(jù)放入其中back_inserter新:vector<char>簡單的迭代器http://ideone.com/9iitv新:將二進(jìn)制數(shù)據(jù)直接放入stringbuf http://ideone.com/qc9QA新:vector<char>簡單的迭代器加邊界檢查http://ideone.com/YyrKy請注意,ostringstream和stringbuf版本運(yùn)行的迭代次數(shù)較少,因?yàn)樗鼈兊乃俣纫枚?。在ideone上,它ostringstream比std:copy+ back_inserter+ 慢大約3倍std::vector,比memcpy原始緩沖區(qū)慢大約15倍。當(dāng)我將實(shí)際應(yīng)用程序切換到自定義緩沖時,這與前后分析一致。這些都是內(nèi)存緩沖區(qū),因此iostream的緩慢不能歸咎于緩慢的磁盤I / O,過多的刷新,與stdio的同步,或者人們用來解釋C ++標(biāo)準(zhǔn)庫觀察到的緩慢的任何其他事情iostream的。很高興看到其他系統(tǒng)上的基準(zhǔn)測試和常見實(shí)現(xiàn)的評論(例如gcc的libc ++,Visual C ++,Intel C ++)以及標(biāo)準(zhǔn)規(guī)定了多少開銷。此測試的基本原理許多人都正確地指出,iostream更常用于格式化輸出。但是,它們也是C ++標(biāo)準(zhǔn)提供的二進(jìn)制文件訪問的唯一現(xiàn)代API。但是對內(nèi)部緩沖進(jìn)行性能測試的真正原因適用于典型的格式化I / O:如果iostreams無法保持磁盤控制器提供原始數(shù)據(jù),那么當(dāng)他們負(fù)責(zé)格式化時,他們怎么可能跟上呢?基準(zhǔn)時間所有這些都是outer(k)循環(huán)的每次迭代。在ideone上(gcc-4.3.4,未知的操作系統(tǒng)和硬件):ostringstream:53毫秒stringbuf:27毫秒vector<char>并且back_inserter:17.6毫秒vector<char> 與普通迭代器:10.6毫秒vector<char> 迭代器和邊界檢查:11.4 mschar[]:3.7毫秒在我的筆記本電腦上(Visual C ++ 2010 x86,cl /Ox /EHscWindows 7旗艦版64位,Intel Core i7,8 GB RAM):ostringstream:73.4毫秒,71.6毫秒stringbuf:21.7 ms,21.3 msvector<char>和back_inserter:34.6毫秒,34.4毫秒vector<char> 與普通迭代器:1.10毫秒,1.04毫秒vector<char> 迭代器和邊界檢查:1.11 ms,0.87 ms,1.12 ms,0.89 ms,1.02 ms,1.14 mschar[]:1.48毫秒,1.57毫秒VISUAL C ++ 2010 x86上,與檔案導(dǎo)引優(yōu)化cl /Ox /EHsc /GL /c,link /ltcg:pgi運(yùn)行,link /ltcg:pgo,措施:ostringstream:61.2 ms,60.5 msvector<char> 與普通迭代器:1.04毫秒,1.03毫秒相同的筆記本電腦,相同的操作系統(tǒng),使用cygwin gcc 4.3.4 g++ -O3:ostringstream:62.7 ms,60.5 msstringbuf:44.4毫秒,44.5毫秒vector<char>和back_inserter:13.5毫秒,13.6毫秒vector<char> 使用普通迭代器:4.1 ms,3.9 msvector<char> 迭代器和邊界檢查:4.0毫秒,4.0毫秒char[]:3.57毫秒,3.75毫
- 3 回答
- 0 關(guān)注
- 986 瀏覽
添加回答
舉報
0/150
提交
取消