Запись строк в текстовый файл во время выполнения программы - более быстрый способ - PullRequest
1 голос
/ 28 мая 2011

Я работаю в C, и мне нужно записать определенные выходные значения в текстовый файл.Эти значения будут записаны в файл в разных точках скрипта.

Я говорю о 50 строках, разделенных на 5 минут времени выполнения.

Мой скрипт тестирует оборудованиепроизводительности (включая кэши процессора и диска), поэтому очень важно, чтобы ничто не замедляло его и не использовало память.

Лучше ли использовать fopen () и fclose () каждый раз, когда я хочу написать строку или простооставить файл открытым для всего исполнения?

Ответы [ 4 ]

4 голосов
/ 28 мая 2011

Почему бы не сохранить все в памяти и записать все за один раз? Я имею в виду использовать массивы структур или что-то в этом роде. Когда придет время, напишите все (fwrite?).

Если вы думаете, что это будет использовать память и нарушать ваши тесты, спросите себя: не будет ли I/O нарушать ваши тесты? Есть ли другой способ хранения информации?

2 голосов
/ 28 мая 2011

У вас не может быть обоих способов - вы должны либо использовать память, либо использовать кеш диска.Обычно можно сохранить статистику в памяти и записать ее в конце теста.Однако, если вы хотите минимизировать использование памяти, откройте файл в начале теста и запишите статистику по ходу работы.

0 голосов
/ 28 мая 2011

Как говорит Нейл, у вас не может быть и того, и другого. Как выделение памяти, так и операции ввода-вывода, как правило, обходятся дорого. Если вы не работаете на настоящей крошечной машине, лучше всего выделить большой буфер до начала временных тестов , а затем заполнить его для записи.

   FILE * fid = fopen( path, "w" );
   if ( !fid ) error();
   setvbuf( fid, NULL, _IOFBF, BLKSIZ * n )

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

Сохраняйте все достаточно маленьким, включая буферы, чтобы вы не запускали подкачку виртуальной машины, иначе каждый тест синхронизации будет вам вреден. Можете ли вы работать с большим количеством оперативной памяти и без файлов подкачки?

0 голосов
/ 28 мая 2011

Являются ли эти выводы частью вашего теста дискового кэша? Если нет, то почему бы не записать напрямую в последовательный порт и позволить другой программе прочитать этот последовательный порт и записать ваши файлы? Просто мысль.

Другая вещь, которую вы можете сделать, это написать строку, которая выглядит как «echo >> file.txt», а затем передать эту строку в функцию system () (в UNIX) или аналог в Windows.

Если это не вариант, запишите вывод в stdout, а затем напишите короткий скрипт, чтобы взять его и записать в файл для вас.

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