Ruby performance on a Mac... am I just late to the party?
-
@thomthom said:
@dan rathbun said:
And as we proved
for .. in
seems to run twice as fast aseach
.. but it's a platform difference.Platform difference?
Sorry ... confusing run-on sentence. The second part was refering to the issue at hand, not the first part of the sentence. (I was tired, and my fingers were not keeping up with my brain. I should have made the last part a full sentence with a proper object.)
Anyway.. you've found the culprit. We already know Ruby string handling can be slow.
I would also suggest (I discussed this in another topic,) that when ever you need to send text to the statusbar, that you use a single quoted string for as much of it as possible with the string append operator
<<
to add replacable portions.Sketchup.set_status_text("Please wait. Generating face #{face_num} of #{total} faces.")
causes Ruby to parse the entire string for regular expressions, special characters ("\n",) and replacable parameters.
I would use:
Sketchup.set_status_text('Please wait. Generating face '<<"#{face_num.to_s} of #{total.to_s}"<<' faces.')
or:
Sketchup.set_status_text('Please wait. Generating face '<<face_num.to_s<<' of '<<total.to_s'<<' faces.')
But NOT this:
Sketchup.set_status_text('Please wait. Generating face '+face_num.to_s+' of '+total.to_s+' faces.')
as the latter causes Ruby to create 9 string objects, and the former only 5.Another issue is needlessly updating the statusbar. If the resolution of a progressbar is say 20 '|' characters, then only update the progressbar on each 5% 'milestone' of the job completion (not every iteration.)
The last issue (if OSX redraws the UI very often,) is to streamline UI object (menuitem and toolbar command,) validation procs. See the other topic: [code] Menu Validation (MF_DISABLED bugged on PC?)
-
@dan rathbun said:
I would also suggest (I discussed this in another topic,) that when ever you need to send text to the statusbar, that you use a single quoted string for as much of it as possible with the string append operator
<<
to add replacable portions.Sketchup.set_status_text("Please wait. Generating face #{face_num} of #{total} faces.")
causes Ruby to parse the entire string for regular expressions, special characters ("\n",) and replacable parameters.
I would use:
Sketchup.set_status_text('Please wait. Generating face '<<"#{face_num.to_s} of #{total.to_s}"<<' faces.')
or:
Sketchup.set_status_text('Please wait. Generating face '<<face_num.to_s<<' of '<<total.to_s'<<' faces.')
But NOT this:
Sketchup.set_status_text('Please wait. Generating face '+face_num.to_s+' of '+total.to_s+' faces.')
as the latter causes Ruby to create 9 string objects, and the former only 5.I think I read somewhere (was it The Ruby Programming Language? - and other places) that "string #{variable}" is the recommended way to generate strings with variables. The extra processing with double quotes was negligible. (Though I always use single quotes as default - remains of my PHP days.)
` > cls
t=Time.now; total=100000; total.times { |i| x = "Please wait. Generating face #{i} of #{total} faces." }; puts Time.now-t
0.22t=Time.now; total=100000; total.times { |i| x = 'Please wait. Generating face '<<"#{i.to_s} of #{total.to_s}"<<' faces.' }; puts Time.now-t
0.393t=Time.now; total=10000; total.times { |i| x = 'Please wait. Generating face '<<i.to_s<<' of '<<total.to_s<<' faces.' }; puts Time.now-t
0.029t=Time.now; total=10000; total.times { |i| x = 'Please wait. Generating face '+i.to_s+' of '+total.to_s+' faces.' }; puts Time.now-t
0.024`@dan rathbun said:
nother issue is needlessly updating the statusbar. If the resolution of a progressbar is say 20 '|' characters, then only update the progressbar on each 5% 'milestone' of the job completion (not every iteration.)
This is where the main issue is at the moment when it comes to updating the statusbar. The generation of the strings are nothing compared.
-
Some more test data:
http://www.igvita.com/2008/07/08/6-optimization-tips-for-ruby-mri/
(The link to Chris Blackburn's site it links to is dead. But there's an archived version: http://replay.waybackmachine.org/20090212130913/http://blog.cbciweb.com/2008/06/10/ruby-performance-use-double-quotes-vs-single-quotes )
Interesting comment on this article: http://replay.waybackmachine.org/20090212130913/http://blog.cbciweb.com/2008/06/10/ruby-performance-use-double-quotes-vs-single-quotes#comment-49One thing that these test doesn't always mention is what Ruby version they where run on. That might make a difference. So the only reliable results is to try out in SketchUp.
-
Ah! This is great. I had no idea. When I wrote progressbar, I could not spell Mac. And since I've moved to the Mac - I have never re-profiled. I will adjust the logic in progressbar to be a better citizen on the Mac.
I would have liked to have responded sooner, but I worked all weekend 'til the wee hours. Thank you all for your input and analysis. I would not have guessed it was the status bar updates. I have commented on the Ruby API doc.
Todd
-
@unknownuser said:
Ah! This is great. I had no idea. When I wrote progressbar, I could not spell Mac. And since I've moved to the Mac - I have never re-profiled. I will adjust the logic in progressbar to be a better citizen on the Mac.
I'd not have thought of checking this had you not made this post. I had made my own progress wrapper right before you posted. It ensures that the statusbar doesn't update more often than a given time, atm 0.1s. I need to check if this is still too quick.
@unknownuser said:
I have commented on the Ruby API doc.
Good thinking.
I've reported the issue to Google. The lag we see under OSX seems unreasonable. -
See my first post - I already reported.
Advertisement