Dirk Einecke | 1 Aug 19:48
Picon

Sowas wie switch() (PHP) gesucht

Hi.

Gibt es in Ruby sowas wie switch() in PHP in Ruby? Klar ich könnte es so 
machen:

if
elsif
elsif
...
end

...aber ein switch wäre manchmal ganz nützlich.

MfG
Dirk Einecke
Philipp Kern | 1 Aug 19:51
Picon

Re: Sowas wie switch() (PHP) gesucht

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

Regards,
Philipp Kern
Dirk Einecke | 1 Aug 19:54
Picon

Performance-Frage - String zusammenbasteln

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
Dirk Einecke | 1 Aug 19:59
Picon

Re: Sowas wie switch() (PHP) gesucht

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
Michael Neumann | 1 Aug 20:39
Picon
Gravatar

Re: Sowas wie switch() (PHP) gesucht

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)

Michael Neumann | 1 Aug 20:49
Picon
Gravatar

Re: Performance-Frage - String zusammenbasteln

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)

Dirk Einecke | 1 Aug 21:07
Picon

Re: Performance-Frage - String zusammenbasteln

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)

Stephan Kämper | 1 Aug 21:30
Picon

Re: Performance-Frage - String zusammenbasteln

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)

Dirk Einecke | 1 Aug 21:39
Picon

Re: Performance-Frage - String zusammenbasteln

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
Michael Neumann | 1 Aug 22:11
Picon
Gravatar

Re: Performance-Frage - String zusammenbasteln

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)


Gmane