From: "Eregon (Benoit Daloze)" Date: 2012-10-26T01:09:24+09:00 Subject: [ruby-core:48287] [ruby-trunk - Bug #6865] GC::Profiler.report might create a huge String and invoke a few GC cycles Issue #6865 has been updated by Eregon (Benoit Daloze). File 0001-gc.c-gc_profile_result-gc_profile_report-use-interna.patch added authorNari (Narihiro Nakamura) wrote: > I see. It is better for memory usage to progressively write the IO stream on #report. > Would you like to try it? Yes. I tried to have a common buffer for all lines, but I could not make it work as rb_io_write() (and others) end up copying the buffer with rb_new_str_frozen(). So I guess a good enough way is to use rb_sprintf(). I attach a patch with this idea. I used the same approach for #result (using rb_sprintf()), do you think it's worth using rb_str_catf() directly instead? It would add some complexity and I'm thinking #report should be preferred to #result. BTW, should unused fields in gc_profile_record not be defined when GC_PROFILE_MORE_DETAIL is false? > Thanks a lot! Thanks for reviewing! ---------------------------------------- Bug #6865: GC::Profiler.report might create a huge String and invoke a few GC cycles https://bugs.ruby-lang.org/issues/6865#change-31578 Author: Eregon (Benoit Daloze) Status: Open Priority: Normal Assignee: authorNari (Narihiro Nakamura) Category: core Target version: ruby -v: ruby 2.0.0dev (2012-08-10 trunk 36676) [x86_64-darwin10.8.0] Hi, In my use-case, GC::Profiler.report adds a few GC cycles to actually create the report, ending with these lines: 9317 26.279 185760 701760 17544 0.33300000000124896360 9318 26.282 185760 701760 17544 0.32800000000321460902 # start of GC::Profiler.report 9319 26.285 393400 701760 17544 0.82300000000046225068 9320 26.288 700480 718080 17952 1.43599999999821648089 9321 26.294 1254800 1272960 31824 2.69300000000072259354 ... 9331 26.907 43836160 43917120 1097928 81.77799999999990632205 This is likely expected with GC::Profiler.result, but I think it could be partly avoided by printing line by line in GC::Profiler.report. Maybe gc_profile_result() could accepts a String or IO as an argument and call #<< or similar ? I might have a try to solve this, but I'd be happy as well if someone solves it before me. The GC::Profiler class documentation should probably be updated to use GC::Profiler.report if it proves to be more efficient. -- http://bugs.ruby-lang.org/