C ++ программа работает медленно в VS2008 - PullRequest
1 голос
/ 18 мая 2010

У меня есть программа, написанная на C ++, которая открывает двоичный файл (test.bin), читает его объект за объектом и помещает каждый объект в новый файл (открывает новый файл, записывает в него (добавление), и закрывает его). Я использую fopen / fclose, fread и fwrite. test.bin содержит 20 000 объектов.

Эта программа запускается под Linux с g ++ за 1 секунду, но в VS2008 в режиме отладки / выпуска через 1 минуту!

Существуют причины, по которым я не делаю их партиями или не храню их в памяти или каких-либо других видах оптимизации.

Мне просто интересно, почему это так медленно под окнами.

Спасибо

Ответы [ 4 ]

4 голосов
/ 18 мая 2010

Я считаю, что когда вы закрываете файл в Windows, он каждый раз сбрасывает содержимое на диск. В Linux я не думаю, что это так . Промывка на каждой операции будет очень дорогой.

3 голосов
/ 18 мая 2010

К сожалению, доступ к файлам в Windows не славится своей невероятной скоростью, особенно если вы открываете много файлов и читаете и записываете только небольшие объемы данных. Для достижения лучших результатов (не особенно полезное) решение будет состоять в том, чтобы считывать большие объемы данных из небольшого количества файлов. (Или полностью перейти на Linux для этой программы?!)

Другие случайные предложения, чтобы попробовать:

  • отключите проверку на вирусы, если она у вас есть (у меня на компьютере установлен Kaspersky, и запись 20 000 файлов быстро привела к бананам)
  • используйте диск NTFS, если он у вас есть (FAT32 будет еще хуже)
  • убедитесь, что вы не случайно используете текстовый режим с fopen (легко сделать)
  • используйте setvbuf для увеличения размера буфера для каждого FILE
  • попробуйте CreateFile / ReadFile / и т. Д. вместо fopen и друзей, которые не решат вашу проблему, но могут сократить время работы на несколько секунд (поскольку функции stdio выполняют дополнительную работу, которая вам, вероятно, не нужна)
0 голосов
/ 18 мая 2010

Я вижу здесь много догадок.

Вы работаете в IDE VS2008. Вы всегда можете воспользоваться «профайлером для бедняков» и узнать точно что происходит.

В эту минуту нажмите кнопку «пауза» и посмотрите, что он делает, включая стек вызовов. Сделайте это несколько раз. Каждая пауза (наверняка = 59/60) почти наверняка поймает, что она делает именно то, чего не делает в Linux.

0 голосов
/ 18 мая 2010

Я думаю, что это не вопрос VS 2008. Это вопрос различий в файловой системе Linux и Windows. И как C ++ работает с файлами в обеих системах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...