Форум: "Начинающим";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];
ВнизЧем писать лог? Найти похожие ветки
← →
Sapersky (2009-10-18 16:20) [40]WriteLn буферизованный. Если ещё буфер задать 2-4 кб вместо стандартных 128 байт (SetTextBuf), будет ещё быстрее.
Я в той ветке на Королевстве выкладывал результат сравнения буферизованного (хотя и не конкретно WriteLn) и небуферизованного методов - разница в 3.5 раза.
← →
DVM © (2009-10-18 16:33) [41]
> Sapersky (18.10.09 16:20) [40]
>
> WriteLn буферизованный.
Да, так и есть. Если писать довольно большими кусками он начинает чуть отставать от Windows.WriteFile
← →
Игорь Шевченко © (2009-10-18 19:00) [42]Для лога, я считаю, гораздо удобнее в ряде случаев использовать не буферизованный ввод/вывод, а закрытие файла после каждой записи. В этом случае удобно а) смотреть лог работающей программы б) в случае ошибки в программе все данные лога будут на диске (а не в текстовом буфере), что в ряде случаев упрощает диагностику.
Кстати, конструкция
AssignFile(F, "foo");
if FileExists("foo") then
Append(F)
else
Rewrite(F);
Лмается на файлах больше двух гигагбайт. Но я не пишу логи в несколько гигабайт - уж больно с ними потом неудобно работать :)
← →
Eraser © (2009-10-18 20:04) [43]для отладки использую
unit ROMLog;
interface
uses
Windows, SysUtils;
function AppendLog(const AMsg: string): Boolean;
var
_csROMLog: TRTLCriticalSection;
implementation
function AppendLog(const AMsg: string): Boolean;
var
fText: TextFile;
sFileName, sText: string;
begin
Result := False;
try
sFileName := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)));
if not DirectoryExists(sFileName + "Logs") then
MkDir(sFileName + "Logs");
sFileName := sFileName + "Logs\" + FormatDateTime("yyyy_mm", Now) +
"_rom_log.txt";
except
Exit;
end;
EnterCriticalSection(_csROMLog);
try
AssignFile(fText, sFileName);
if FileExists(sFileName) then
Append(fText)
else
Rewrite(fText);
try
sText := FormatDateTime("dd-mm-yyyy_hh:nn:ss", Now) +
"#T:" + AMsg;
Writeln(fText, sText);
finally
CloseFile(fText);
end;
Result := True;
finally
LeaveCriticalSection(_csROMLog);
end;
end;
initialization
InitializeCriticalSection(_csROMLog);
finalization
DeleteCriticalSection(_csROMLog);
end.
если лог нужен для функционала, то лучше использовать другой подход.
← →
DVM © (2009-10-18 20:42) [44]
> Игорь Шевченко © (18.10.09 19:00) [42]
> Для лога, я считаю, гораздо удобнее в ряде случаев использовать
> не буферизованный ввод/вывод, а закрытие файла после каждой
> записи
Только у этого способа есть один недостаток - уж слишком сильно замедляет программу при интенсивном логгировании.
← →
Игорь Шевченко © (2009-10-18 21:19) [45]DVM © (18.10.09 20:42) [44]
Как ты понимаешь - кому что надо, кому надо подробный лог для диагностики (а для чего еще лог нужен?), кому надо быстро. Для "быстрого" протоколирования мы использовали отдельный процесс, которому посылали сообщения о необходимости занесения в протокол тех или иных данных, натурально, у этого процесса был достаточный буфер, чтобы он не захлебывался при приеме сообщений с достаточно интенсивной скоростью, разумеется, было управление файлами, чтобы текущий протокол по достижении нужного размера/количества записей отключался и сбрасывался в базу данных/архив, а запись при этом велась в другой файл, ну и так далее.
Только сложно это - мы использовали для протоколирования работы нескольких связанных процессов, Event log нам не понравился, уж больно неудобно делать его пост-обработку.
← →
Leonid Troyanovsky © (2009-10-18 23:46) [46]
> DVM © (18.10.09 16:06) [39]
> Writeln почти в 2 раза обгоняет Windows.WriteFile и соответственно
> TFileStream.
У тебя тесты какие-то неправильные.
--
Regards, LVT.
← →
DVM © (2009-10-19 00:47) [47]
> Leonid Troyanovsky © (18.10.09 23:46) [46]
> У тебя тесты какие-то неправильные.
Может поделишься правильными? И мы поучимся.
← →
sniknik © (2009-10-19 01:08) [48]> Может поделишься правильными?
лучше "правильным" компьютером с новыми дисками которым программная буферизация только мешает... (адрес для "дележки" в личку ;о) )
← →
Leonid Troyanovsky © (2009-10-19 18:58) [49]
> DVM © (19.10.09 00:47) [47]
> > У тебя тесты какие-то неправильные.
> Может поделишься правильными?
Ну, ты ж сам все правильно объяснил.
Внизу лежит WriteFile, сверху - overhead.
Там же еще парсинг строк и т.п.
Сравнивать можно, скажем, WriteFile vs memory mapped file,
хотя, наверное, и это мну не очень интересно.
Проще, наверное, если б ты показал сравнения
(у тебя, IMHO, д.б. где-то под рукой),
а мы постараемся найти огрех.
--
Regards, LVT.
← →
DVM © (2009-10-19 20:17) [50]
> Leonid Troyanovsky © (19.10.09 18:58) [49]
> а мы постараемся найти огрех.
Да нет там огреха. Понятно, что я сравнивал "просто Writeln" с "просто WriteFile" и TFileStream.Write(). Только вот "просто Writeln" оказался "просто буферизованный Writeln".
Большинство ведь и не догадываются о том, что Writeln использует хитрую буферизацию и внутренности Writeln как правило мало кем изучаются и Writeln рассматривается как нечто совсем простое как 2 копейки. Ан нет оказывается, Writeln не так прост. Я вот сам заблуждался.
Очевидно, что если организовать/задействовать буферизацию WriteFile/TFileStream то как минимум они сравняются.
← →
Leonid Troyanovsky © (2009-10-19 20:34) [51]
> DVM © (19.10.09 20:17) [50]
> Да нет там огреха.
> Очевидно, что если организовать/задействовать буферизацию
> WriteFile/TFileStream то как минимум
Дык, тут и огрех, чего у ж там далее.
Сравнивать стоит сопоставимое.
> задействовать буферизацию WriteFile/TFileStream то как минимум
Ясенное дело, что сравняются "как минимум", бо выше - overhead.
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2009-10-19 22:57) [52]> DVM (19.10.2009 20:17:50) [50]
Writeln ой как не просто, начнем с того, что нет процедуры Writeln, это компьютерная магия.
Кроме того зачем сравнивать низкоуровневый вывод с высокоуровневым, когда за сценой ой как много чего справлено, избавляя от необходимости думать об преобразованиях. Можно сравнивать например с Бейсиком или некоторыми другими языками, которые имеют встроеные средства ввода/вывода.
WriteLn(F, Integer, Float, Boolean, DateTime, string) и все это одновременно в одном вызове без необходимости преобразования в текстовый формат, плюс есть и небольшие возможности форматирования вывода, что не мешает внешнему форматированию. Плюс еще и буферизация и возможность расширения.
Но есть некоторые ограничения, по режимам открытия файла, по Юникоду, ведь "функции" более 30 лет.
← →
Германн © (2009-10-20 01:51) [53]Начиная с "DVM © (18.10.09 14:24) [33]"
начался холивар, который продолжил холивар на Королевстве, и которого так жаждал автор сабжа.
Ну почему-бы автору не задать сей вопрос на www.sources.ru? Там к холиварам вроде нормально относятся.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.006 c