1 Aug 19:48
1 Aug 19:51
1 Aug 19:54
Performance-Frage - String zusammenbasteln
Dirk Einecke <ruby-de-talk <at> dirkeinecke.de>
2004-08-01 17:54:47 GMT
2004-08-01 17:54:47 GMT
Hi.
Ich habe ein Programm, bei dem ich haufenweise Strings zusammenbastle.
Nun gibt es dafür ja zwei Möglichkeiten:
1.
newPath = ENV['DOCUMENT_ROOT'] + 'foo/bar/' + path
2.
newPath = "#{ENV['DOCUMENT_ROOT']}foo/bar/#{path}"
Was ist da schneller?
Oder gibt es noch bessere Lösungen?
MfG
Dirk Einecke
1 Aug 19:59
Re: Sowas wie switch() (PHP) gesucht
Dirk Einecke <ruby-de-talk <at> dirkeinecke.de>
2004-08-01 17:59:27 GMT
2004-08-01 17:59:27 GMT
Hi. Philipp Kern wrote: > On So, 2004-08-01 at 19:48, Dirk Einecke wrote: >>Gibt es in Ruby sowas wie switch() in PHP in Ruby? Klar ich könnte es so >>machen: > > case foo > when 1 then puts 1 > end Ah. Genau sowas habe ich gesucht. Vielen Dank. MfG Dirk Einecke
1 Aug 20:39
Re: Sowas wie switch() (PHP) gesucht
Michael Neumann <mneumann <at> ntecs.de>
2004-08-01 18:39:03 GMT
2004-08-01 18:39:03 GMT
Philipp Kern wrote: > On So, 2004-08-01 at 19:48, Dirk Einecke wrote: > >>Gibt es in Ruby sowas wie switch() in PHP in Ruby? Klar ich könnte es so >>machen: > > > case foo > when 1 then puts 1 > end > Is sogar noch besser als in C, da du nicht aufpassen musst, das "break" zu vergessen: case foo when 1 ... when 2 ... when 3,5,7 # auch mehrfach vergleiche möglich ... when 8..10 # ranges gehen auch ... else # 'default:' zweig end natürlich geht das für jedes beliebige objekt, nicht nur zahlen. hierbei wird per === verglichen (nicht ==), deshalb funktioniert das auch mit(Continue reading)
1 Aug 20:49
Re: Performance-Frage - String zusammenbasteln
Michael Neumann <mneumann <at> ntecs.de>
2004-08-01 18:49:27 GMT
2004-08-01 18:49:27 GMT
Dirk Einecke wrote:
> Hi.
>
> Ich habe ein Programm, bei dem ich haufenweise Strings zusammenbastle.
> Nun gibt es dafür ja zwei Möglichkeiten:
>
> 1.
> newPath = ENV['DOCUMENT_ROOT'] + 'foo/bar/' + path
>
> 2.
> newPath = "#{ENV['DOCUMENT_ROOT']}foo/bar/#{path}"
Also generell würde ich bei längeren strings << bevorzugen. #{} scheint
aber zumindest für kurze strings schneller zu sein.
Hier ein kleiner Benchmark:
require 'benchmark'
N = 2_000_000
Benchmark.bm do |x|
a = "blah 123 123 123".freeze
x.report("\#{}") { N.times { "#{ a }#{ a }#{ a }#{ a }#{ a }" } }
x.report("+") { N.times { a + a + a + a + a } }
x.report("<<") { N.times { (s = "") << a << a << a << a << a } }
end
Grüsse,
(Continue reading)
1 Aug 21:07
Re: Performance-Frage - String zusammenbasteln
Dirk Einecke <ruby-de-talk <at> dirkeinecke.de>
2004-08-01 19:07:16 GMT
2004-08-01 19:07:16 GMT
Hi.
Michael Neumann wrote:
> Dirk Einecke wrote:
>
>> Ich habe ein Programm, bei dem ich haufenweise Strings zusammenbastle.
>> Nun gibt es dafür ja zwei Möglichkeiten:
>>
>> 1.
>> newPath = ENV['DOCUMENT_ROOT'] + 'foo/bar/' + path
>>
>> 2.
>> newPath = "#{ENV['DOCUMENT_ROOT']}foo/bar/#{path}"
>
> Also generell würde ich bei längeren strings << bevorzugen. #{} scheint
> aber zumindest für kurze strings schneller zu sein.
Was sind denn bei dir kurze Strings? Also bis zu wieviel "Komonenten"
die zusammengesetzt werden sollen? Kann an das so allgemein sagen?
Bisher hatte ich sowas:
path = p.directory + p.filename + '.rb'
Würde nun
path = "#{p.directory}#{p.filename}.rb"
oder
path = p.directory << p.filename << '.rb'
besser sein?
> Hier ein kleiner Benchmark:
(Continue reading)
1 Aug 21:30
Re: Performance-Frage - String zusammenbasteln
Stephan Kämper <Stephan.Kaemper <at> Schleswig-Holstein.de>
2004-08-01 19:30:18 GMT
2004-08-01 19:30:18 GMT
Dirk Einecke wrote:
> Hi.
>
> Michael Neumann wrote:
>
>> Dirk Einecke wrote:
>>
>>> Ich habe ein Programm, bei dem ich haufenweise Strings
zusammenbastle. Nun gibt es dafür ja zwei Möglichkeiten:
>>>
>>> 1.
>>> newPath = ENV['DOCUMENT_ROOT'] + 'foo/bar/' + path
>>>
>>> 2.
>>> newPath = "#{ENV['DOCUMENT_ROOT']}foo/bar/#{path}"
>>
>>
>>
>> Also generell würde ich bei längeren strings << bevorzugen. #{}
scheint aber zumindest für kurze strings schneller zu sein.
>
>
>
> Was sind denn bei dir kurze Strings? Also bis zu wieviel "Komonenten"
die zusammengesetzt werden sollen? Kann an das so allgemein sagen?
>
> Bisher hatte ich sowas:
> path = p.directory + p.filename + '.rb'
>
(Continue reading)
1 Aug 21:39
Re: Performance-Frage - String zusammenbasteln
Dirk Einecke <ruby-de-talk <at> dirkeinecke.de>
2004-08-01 19:39:30 GMT
2004-08-01 19:39:30 GMT
Hi. Stephan Kämper wrote: > String.<< hängt das Argument an den gegebenen String an und verändert > den Empfänger der Nachricht. > String.+ dagegen läßt den Empfänger der Methode unverändert und liefert > einen nagelneuen String. Das kostet natürlich ein wenig (Zeit und > Speicher). > > irb(main):001:0> a = 'a' > => "a" > irb(main):002:0> a << 'b' > => "ab" > irb(main):003:0> a > => "ab" > irb(main):004:0> a + 'c' > => "abc" > irb(main):005:0> a > => "ab" > irb(main):006:0> > > Hoffe das half.Okay. Alles klar. Danke. MfG Dirk Einecke
1 Aug 22:11
Re: Performance-Frage - String zusammenbasteln
Michael Neumann <mneumann <at> ntecs.de>
2004-08-01 20:11:07 GMT
2004-08-01 20:11:07 GMT
Dirk Einecke wrote:
> Bisher hatte ich sowas:
> path = p.directory + p.filename + '.rb'
>
> Würde nun
> path = "#{p.directory}#{p.filename}.rb"
> oder
> path = p.directory << p.filename << '.rb'
> besser sein?
komischerweise ist das erste (also mit +) am schnellsten, wenn directory
und filename so jeweils um die 20 bytes gross sind.
Aber wenn du das nicht in einer Schleife mehrere tausend mal ausführst,
oder wirklich grosse Strings zusammenbaust, dann ist es wirklich wurscht
was du verwendest. Ich würde dann lieber auf lesbarkeit achten.
BTW, Pfade kannst du auch mit File.join zusammenbauen.
File.join("a", "b", "c") # => "a/b/c"
>> Hier ein kleiner Benchmark:
>>
>> require 'benchmark'
>
>
> Kann ich leider auf dem Server nicht machen, dieses Modul nicht
> installiert ist:
> info.rb:3:in `require': No such file to load -- benchmark (LoadError)
(Continue reading)
Okay. Alles klar. Danke.
MfG
Dirk Einecke
RSS Feed