Ruby Inline - bład

Chciałbym uruchomić taki skrypt Ruby+C (dla przyspieszenia). Pomijam już jego zastosowanie.

[code]require ‘set’
require ‘inline’

class TheCinline do |builder|
builder.include ‘<stdio.h>’
builder.include ‘<stdlib.h>’
builder.include ‘<time.h>’
inline do |builder|
builder.c ’
int trasa (int cel, int road){
int zarodek=0;
int a=0;
zarodek=time(NULL);
srand(zarodek);
if((road>420) &&(road<441))
road+=1;
else if(road%21==0)
road+=21;
else
{
a=rand()%2
if(a==0)
road+=1;
else
road+=21;
}
return road;
}’
end
end
class Demotywatory
attr :jedziemy
def jedziemy(cel=441,road=1,a=0,liczydlo=0)
puts(“Norma”)
b=Time.new

grand=Set.new

for i in 0..2000000000
     small=Array.new
   while(road!=cel)

test=TheCinline.new(cel,road)
small.push(road)
end

grand.add(small)

liczydlo+=1
road=1

if liczydlo==1000
puts(Time.new-b)
end

end
puts(“Koniec to#{liczydlo}”)
end
end
if FILE == $0
mg=Demotywatory.new
mg.jedziemy

end[/code]
Po uruchomieniu wyskakuje taki tajemniczy błąd:

Eksperyment.rb:29: syntax error, unexpected '\n', expecting tCOLON2 or '[' or '.'

W czym rzecz?
Dziękuję za same próby rozwiązania :slight_smile:

nie mam jak sprawdzic, ale chyba cos takiego powinno byc

[code=ruby]require ‘set’
require ‘inline’

class TheCinline
inline do |builder|
builder.include ‘<stdio.h>’
builder.include ‘<stdlib.h>’
builder.include ‘<time.h>’
builder.c "
int trasa (int cel, int road){
int zarodek=0;
zarodek=time(NULL);
srand(zarodek);
if((road>420) &&(road<441))
road+=1;
else if(road%21==0)
road+=21;
else
{
rand()%2
if(a==0)
road+=1;
else
road+=21;
}
return road;
}"
end
end

class Demotywatory
attr :jedziemy
def jedziemy(cel=441,road=1,a=0,liczydlo=0)
puts(“Norma”)
b=Time.new

grand=Set.new

for i in 0..2000000000
  small=Array.new
  while(road!=cel)
    test=TheCinline.new(cel,road)
    small.push(road)
  end


  grand.add(small) 

  liczydlo+=1
  road=1 


  if liczydlo==1000
    puts(Time.new-b) 
  end

end
puts("Koniec to#{liczydlo}") 

end
end

if FILE == $0
mg=Demotywatory.new
mg.jedziemy
end[/code]

ps z ta wydajnoscia nie przesadzaj, nie sadze by w takich kodach zysk byl jakis sensowny. Nie widze powodu dla ktorego to robisz

Wielkie dzięki. Jeszcze trochę pokombinowałem i poszło :slight_smile:
A optymalizacja jest mi porzebna, bo metodą brute-force mam miliardy różniastych Arrayów wygenerować metodą losowania :smiley: (taka zabawa, powiedzmy :wink: )

Hmm rzeczywiście dużo nie zaoszczędziłem ;p

Spróbuj zastąpić

small.push(road)

tym

small << road

W obecnym kodzie chodzi tylko o wyznaczenie wartości zmiennej liczydlo, po co więc dodawane są zmienne small typu Array do zmiennej grand typu Set ?

Jak obecnie wygląda czas wykonania i zużycie pamięci ?

Znalazłem coś podobnego http://ideone.com/wI69MH .

[quote=marr]Spróbuj zastąpić

small.push(road)

tym

small << road

[/quote]
A co to miałoby dać? W tym wypadku ten kawałek kodu robi dokładnie to samo.

“<<” jest szybsze niż “push”

[quote=radarek][quote=marr]Spróbuj zastąpić

small.push(road)

tym

small << road

[/quote]
A co to miałoby dać? W tym wypadku ten kawałek kodu robi dokładnie to samo.[/quote]

[code=“Ruby”]require ‘benchmark’

a = []
n = 1000000
Benchmark.bm do |x|
x.report("<<") { n.times {|x| a << x } }
a = []
x.report(“push”) { n.times {|x| a.push x } }
end[/code]

ruby array_test.rb user system total real << 0.410000 0.010000 0.420000 ( 0.436335) push 0.570000 0.010000 0.580000 ( 0.589333)

Tak, tak, a for in … jest szybsze od #each :slight_smile: (https://gist.github.com/229951 ). To się nijak ma do kodu, który robi coś więcej niż wywołuję tę 1 konkretną funkcję. To się nijak ma do 99.9999999% kodu produkcyjnego. A bez profilowania kodu to już w ogóle szkoda sobie zaprzątać głowę takimi pierdołami.