Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
8-1201846793
ZMRaven
2008-02-01 09:19
2009.12.06
Картинка с экрана


2-1255702102
Aleks
2009-10-16 18:08
2009.12.06
Как узнать индекс доб.итема в ListView?


6-1210255588
AtZako
2008-05-08 18:06
2009.12.06
Разорвать OnHeadersAvailable


15-1255101350
Дмитрий С
2009-10-09 19:15
2009.12.06
Как получить нормально распределенное случаное число от 0 до 1 и


15-1254947408
Юрий
2009-10-08 00:30
2009.12.06
С днем рождения ! 8 октября 2009 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский