Re[7]: загрузить файл в std::string не используя буфер
От: _Vladimir_ Россия  
Дата: 04.06.04 10:34
Оценка:
Здравствуйте, 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
Re[8]: загрузить файл в std::string не используя буфер
От: ArtDenis Россия  
Дата: 04.06.04 10:54
Оценка:
Здравствуйте, _Vladimir_, Вы писали:

_V_>Дополнение к сообщению
Автор: _Vladimir_
Дата: 04.06.04
.

_V_>Попробовал выполнить свой тест на VC++ 7, время выполнения заметно отличаются от C++Builder 6.
_V_>Есть над чем подумать!

Это всё из-за того, что в 6-м Билдере в качестве STL используют STLPort, в котором потоки реализуются через проецироемые в память файлы. Отсюда и ускорение при побайтовых операциях.
... << Rsdn@Home 1.1.4 beta 1 >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[8]: загрузить файл в std::string не используя буфер
От: folk Россия  
Дата: 04.06.04 10:56
Оценка:
Здравствуйте, _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
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[9]: загрузить файл в std::string не используя буфер
От: _Vladimir_ Россия  
Дата: 04.06.04 11:07
Оценка:
Здравствуйте, 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, а хотя бы в десять раз побольше .
Re[10]: загрузить файл в std::string не используя буфер
От: folk Россия  
Дата: 04.06.04 14:07
Оценка:
Здравствуйте, _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
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.