|
From: Maciej Sobczak on 19 Aug 2008 16:27 It seems to me that the file output in standard Ada library is not buffered: 1. There is no buffer-related operation in the whole library. 2. The semantics of output operations is defined in terms of the effects on external file. 3. The performance of simple test is consistent with what can be obtained in equivalent C code that flushes the channel after every operation (ie. some 15-20x slower than with default buffering). Let's suppose that I want to add buffering to my output. I can write the stream type that does the necessary magic, but how can I reuse the formatting machinery that is already available in Ada.Text_IO and related packages? -- Maciej Sobczak * www.msobczak.com * www.inspirel.com Database Access Library for Ada: www.inspirel.com/soci-ada
From: Georg Bauhaus on 20 Aug 2008 02:45 Maciej Sobczak wrote: > Let's suppose that I want to add buffering to my output. I can write > the stream type that does the necessary magic, but how can I reuse the > formatting machinery that is already available in Ada.Text_IO and > related packages? Some formatting procedures from {Number}_IO and from Editing can write to a String instead of to a File_Type. Can you stream the strings to a buffer? There is an article on AdaPower entitlet something like "How to access memory as a String". I think it will illustrate reliable tricks, possibly of some use when handling data in the "external" world. In any case, char_array values are good for OS procedures of names like write, read, and so on. -- Georg Bauhaus Y A Time Drain http://www.9toX.de
From: Maciej Sobczak on 20 Aug 2008 04:43 On 19 Sie, 22:27, Maciej Sobczak <see.my.homep...(a)gmail.com> wrote: > It seems to me that the file output in standard Ada library is not > buffered: > 1. There is no buffer-related operation in the whole library. > 2. The semantics of output operations is defined in terms of the > effects on external file. > 3. The performance of simple test is consistent with what can be > obtained in equivalent C code that flushes the channel after every > operation (ie. some 15-20x slower than with default buffering). Now I'm puzzled, because it looks like the files are written in chunks of 32kB. In other words, nothing is written to the file until the total output accumulated to 32kB and the step is preserved for each future write - this indicates that the buffering is actually in use. My original observations become questions: 1. Why there is no buffer-related operation in the whole library? In particular: how can I *flush* the buffer? This is very important for log files. I have discovered this exactly because the log is not written synchronously with Put operations, which makes it "a bit" less useful. How can I make sure that what I Put is actually written? Closing a file after each Put does not make much sense. 2. What about the semantics of Put? 3. Why is buffered Ada.Text_IO as slow as non-buffered C's stdio? Who is eating the 20x factor? -- Maciej Sobczak * www.msobczak.com * www.inspirel.com Database Access Library for Ada: www.inspirel.com/soci-ada
From: Maciej Sobczak on 20 Aug 2008 04:59 On 20 Sie, 10:43, Maciej Sobczak <see.my.homep...(a)gmail.com> wrote: I will answer myself: > 1. Why there is no buffer-related operation in the whole library? Heh, there is. > In particular: how can I *flush* the buffer? By calling Ada.Text_IO.Flush. Which means that Georg Bauhaus fell into the trap of my confusion. :-) Still valid question: > 3. Why is buffered Ada.Text_IO as slow as non-buffered C's stdio? Who > is eating the 20x factor? -- Maciej Sobczak * www.msobczak.com * www.inspirel.com Database Access Library for Ada: www.inspirel.com/soci-ada
From: Dmitry A. Kazakov on 20 Aug 2008 05:21 On Wed, 20 Aug 2008 01:59:52 -0700 (PDT), Maciej Sobczak wrote: > On 20 Sie, 10:43, Maciej Sobczak <see.my.homep...(a)gmail.com> wrote: > > Still valid question: > >> 3. Why is buffered Ada.Text_IO as slow as non-buffered C's stdio? Who >> is eating the 20x factor? Because of page formatting, I suggest. You can use text streams instead. [But don't use String'Write! Although, the newest GNAT optimized that, AFAIK.] BTW, buffering does not make I/O faster. It obviously does the opposite. Certainly, you didn't mean the "last-mile" buffer held by the driver, which is usually inaccessible. In some elder OSes you could directly write from a user buffer mapped by the kernel, have record files etc. That was *fast*. But then came C, Unix and Co., you know... (:-)) -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de
|
Next
|
Last
Pages: 1 2 3 4 Prev: Ada.Text_IO.Fixed_IO - strange prefix in output Next: gnat cross compilation |