Здравствуйте, ArtDenis.
Дополнение к
сообщениюАвтор: _Vladimir_
Дата: 04.06.04
.
Попробовал выполнить свой тест на VC++ 7, время выполнения заметно отличаются от C++Builder 6.
Есть над чем подумать!
Результаты теста на VC++7.0:
test file "D:/temp/test/test1.txt", size 320, count 100000
null — 1933 ms
system — 1702 ms
system shared buffer — 1733 ms
buffer — 2563 ms
string.resize — 2544 ms
string.insert — 4777 ms
std::copy — 4857 ms
test file "D:/temp/test/test2.txt", size 19047, count 10000
null — 200 ms
system — 381 ms
system shared buffer — 380 ms
buffer — 551 ms
string.resize — 1021 ms
string.insert — 36923 ms
std::copy — 13900 ms
test file "D:/temp/test/test3.txt", size 750330, count 1000
null — 10 ms
system — 7511 ms
system shared buffer — 6840 ms
buffer — 8221 ms
string.resize — 6860 ms
string.insert — ?????? ms
std::copy — 56672 ms
test file "D:/temp/test/test3.txt", size 750330, count 1
string.insert — 48360 ms
Интересно, что string.insert для больших файлов работает черезмерно долго

!!!
Для 1000 итераций, я просто не дождался окончания.
Если прикинуть то это заняло бы больше 13 часов!!! (48с * 1000).
Для сравнения результаты работы на C++Builder 6:
test file "D:/temp/test/test1.txt", size 320, count 100000
null — 2023 ms
system — 2053 ms
system shared buffer — 2043 ms
buffer — 5367 ms
string.resize — 4637 ms
string.insert — 5568 ms
std::copy — 5238 ms
test file "D:/temp/test/test2.txt", size 19047, count 10000
null — 200 ms
system — 1031 ms
system shared buffer — 1032 ms
buffer — 3084 ms
string.resize — 3145 ms
string.insert — 10004 ms
std::copy — 8292 ms
test file "D:/temp/test/test3.txt", size 750330, count 1000
null — 20 ms
system — 10595 ms
system shared buffer — 9885 ms
buffer — 15252 ms
string.resize — 14440 ms
string.insert — 40589 ms
std::copy — 33868 ms
Здравствуйте, _Vladimir_, Вы писали:
_V_>Дополнение к сообщениюАвтор: _Vladimir_
Дата: 04.06.04
.
_V_>Попробовал выполнить свой тест на VC++ 7, время выполнения заметно отличаются от C++Builder 6.
_V_>Есть над чем подумать!
Это всё из-за того, что в 6-м Билдере в качестве STL используют STLPort, в котором потоки реализуются через проецироемые в память файлы. Отсюда и ускорение при побайтовых операциях.
... << Rsdn@Home 1.1.4 beta 1 >>
Здравствуйте, _Vladimir_, Вы писали:
_V_>Дополнение к сообщениюАвтор: _Vladimir_
Дата: 04.06.04
.
_V_>Попробовал выполнить свой тест на VC++ 7, время выполнения заметно отличаются от C++Builder 6.
_V_>Есть над чем подумать!
_V_>Результаты теста на VC++7.0:
[]
Повторил у себя твой тест, только вычеркнул хакерский вариант с прямым чтением в string и добавил вариант с интервальным конструктором string (без определения размера файла и резервирования):
string read_str_JUST_CTOR( const string& filename )
{
ifstream file;
file.open( filename.c_str(), ios::in | ios::binary );
string text( (istreambuf_iterator<char>(file)), istreambuf_iterator<char>() );
return text;
}
Выводы такие (справедливые по крайней мере для vc7.1/dinkumware):
1. Блочное чтение с промежуточным буфером начинает обгонять прямое посимвольное чтение уже на файлах размером в сотни байт.
2. Если не заморачиваться с промежуточными буферами, то и не нужно выеживаться с резервированием. Простое чтение из файла с помощью конструктора всегда обгоняет варианты с резервированием+insert/copy (а на десятках байт обгоняет вообще всех).
_V_>Интересно, что string.insert для больших файлов работает черезмерно долго
!!!
_V_>Для 1000 итераций, я просто не дождался окончания.
_V_>Если прикинуть то это заняло бы больше 13 часов!!! (48с * 1000).
Гм, у меня string.insert на больших файлах выполняется незначительно быстрее std::copy. Вот цифры, если интересно:
test file "G:/temp/tiny.txt", size 56, count 10000
null - 1328 ms
system - 1344 ms
system shared buffer - 1328 ms
buffer - 1734 ms
string.insert - 1890 ms
std::copy - 1860 ms
string ctor - 1687 ms
test file "G:/temp/small.txt", size 569, count 10000
null - 1359 ms
system - 1360 ms
system shared buffer - 1328 ms
buffer - 1734 ms
string.insert - 2359 ms
std::copy - 2313 ms
string ctor - 2140 ms
test file "G:/temp/med.txt", size 5680, count 10000
null - 1328 ms
system - 1719 ms
system shared buffer - 1640 ms
buffer - 2219 ms
string.insert - 7062 ms
std::copy - 7688 ms
string ctor - 6875 ms
test file "G:/temp/big.txt", size 56800, count 10000
null - 1344 ms
system - 6531 ms
system shared buffer - 6359 ms
buffer - 6172 ms
string.insert - 57875 ms
std::copy - 60453 ms
string ctor - 58781 ms
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Здравствуйте, folk, Вы писали:
_V_>>Интересно, что string.insert для больших файлов работает черезмерно долго
!!!
_V_>>Для 1000 итераций, я просто не дождался окончания.
_V_>>Если прикинуть то это заняло бы больше 13 часов!!! (48с * 1000).
F>Гм, у меня string.insert на больших файлах выполняется незначительно быстрее std::copy. Вот цифры, если интересно:
Обрати внимание на размер файла, который я использовал последним:
test file "D:/temp/test/test3.txt", size 750330, count 1
string.insert — 48360 ms
750Kb за 48c, это при том, что я включил все возможные оптимизации кода.
Рекомедую попробовать файл не 56Kb, а хотя бы в десять раз побольше

.
Здравствуйте, _Vladimir_, Вы писали:
_V_>>>Интересно, что string.insert для больших файлов работает черезмерно долго
!!!
_V_>>>Для 1000 итераций, я просто не дождался окончания.
_V_>>>Если прикинуть то это заняло бы больше 13 часов!!! (48с * 1000).
F>>Гм, у меня string.insert на больших файлах выполняется незначительно быстрее std::copy. Вот цифры, если интересно:
_V_>Обрати внимание на размер файла, который я использовал последним:
_V_>test file "D:/temp/test/test3.txt", size 750330, count 1
_V_>string.insert — 48360 ms
Я не видел смысла измерять производительность в настолько абсурдном случае, string размером под мегабайт — явный misuse.
_V_>750Kb за 48c, это при том, что я включил все возможные оптимизации кода.
_V_>Рекомедую попробовать файл не 56Kb, а хотя бы в десять раз побольше
.
Да мне не сложно:
test file "g:/temp/verybig.txt", size 733585, count 1000
null - 110 ms
system - 11265 ms
system shared buffer - 10203 ms
buffer - 9141 ms
string.insert - 67016 ms
std::copy - 68703 ms
string ctor - 65156 ms
Для insert у меня получается 733 кб за 0.067 сек, что примерно в семьсот раз быстрее твоего варианта. Похоже компиляторы vc7.0 и vc7.1 генерируют принципиально различный код для insert
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн