Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.06;
Скачать: CL | DM;

Вниз

Чем писать лог?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.015 c
2-1256063307
Novii
2009-10-20 22:28
2009.12.06
Bitmap and Bitmap


15-1250841620
Empleado
2009-08-21 12:00
2009.12.06
На чем мультики делать?


2-1255949054
Роман
2009-10-19 14:44
2009.12.06
как вывести отчет


2-1255773566
dplz
2009-10-17 13:59
2009.12.06
Цвет выделенный строк в combobox без csOwnerDrawFixed


2-1255613270
pest
2009-10-15 17:27
2009.12.06
7-bit ASCII в заголовке pop письма