[#387246] newbie question — sunny parker <info@2020proj.com>

i am coming from php and dont seem to quite understand how ruby works

13 messages 2011/09/01

[#387330] installing naive bayes classifier — aya abdelsalam <ayoya_91@...>

Hello

10 messages 2011/09/02

[#387344] Beginner needing help - Writing right-angle triangle program — Kane Williams <theburrick@...>

I've been going through a Haskell tutorial (Just to see what it's like)

12 messages 2011/09/03

[#387356] Which version should I download? — Vladimir Van Bauenhoffer <cluny_gisslaren@...>

Im new to programming and Im thinking of downloading and starting with

17 messages 2011/09/03

[#387392] loops problem — jack jones <shehio_22@...>

for (j = @array.length ; j > counter ; j = j-1) # counter is a variable

13 messages 2011/09/04

[#387469] posts on Unix systems programming — Eric Wong <normalperson@...>

I would like to do a series of mailing list posts on the subject of Unix

28 messages 2011/09/06

[#387530] Unexpected behavior of Ruby array — Suvankar Satpati <suvankar.17@...>

I was going through the exercises at http://rubykoans.com/ and got

11 messages 2011/09/08

[#387544] Executing the output of a look — dwight schrute <spambocks@...>

Hi,

14 messages 2011/09/08

[#387586] Creating a hash from two arrays — simon harrison <simonharrison.uk@...>

Hi. Can anyone help with this? I'd like to end with a hash like so:

15 messages 2011/09/09

[#387596] newbie ruby installation malloc issue — "mark e." <mark_f_edwards@...>

hi all -

12 messages 2011/09/09

[#387614] how to write data in binary to a file? — frank hi <yw_hi@163.com>

Hi,

11 messages 2011/09/10

[#387646] How do I make output generate a float without an excess numbers of decimal places? — Kane Williams <theburrick@...>

For example, my current code is

11 messages 2011/09/11

[#387725] Any downsides to writing paranthesises? — Vladimir Van Bauenhoffer <cluny_gisslaren@...>

Im a newbie programmer who is trying to learn Ruby after having just

18 messages 2011/09/12

[#387811] Get interpreter path — Michal Suchanek <hramrach@...>

Hello,

26 messages 2011/09/14
[#387842] Re: Get interpreter path — Phillip Gawlowski <cmdjackryan@...> 2011/09/14

On Wed, Sep 14, 2011 at 3:35 PM, Michal Suchanek <hramrach@centrum.cz> wrot=

[#387844] Re: Get interpreter path — Michal Suchanek <hramrach@...> 2011/09/14

On 14 September 2011 20:47, Phillip Gawlowski <cmdjackryan@gmail.com> wrote:

[#387814] Tough Ruby Homework — Rory Pascua <rorypascua@...>

I'm trying to take a long piece of text, find a word, and get that word

18 messages 2011/09/14

[#387853] Can I Safely Use Rubinius While Learning? — Aaron Jackson <jacksonaaronc@...>

Greetings,

18 messages 2011/09/15

[#387915] Some newbie questions — Vladimir Van Bauenhoffer <cluny_gisslaren@...>

I got some newbie questions which I would very much appreciate if

14 messages 2011/09/15

[#388003] Ruby Speed Question — Kevin Anon <oblivious.sage@...>

Wrote my first Ruby program recently for a class assignment where we had

12 messages 2011/09/18

[#388078] appending \n to each element in an array — Joe Collins <joec_49@...>

I have an array

13 messages 2011/09/20

[#388123] Turning on a special program at special time and turning off the computer at another special time — "amir e." <aef1370@...>

I decided to write a program in RUBY wherein these items have been done

11 messages 2011/09/21
[#388124] Re: Turning on a special program at special time and turning off the computer at another special time — andrew mcelroy <sophrinix@...> 2011/09/21

That sounds like a program a special program a terrorist would write. Are

[#388198] Conditional statements with multiple arguments — "Thomas B." <sinixlol@...>

Good afternoon everyone,

18 messages 2011/09/24

[#388203] Ruby 1.9.3 RC1 is out — "Yuki Sonoda (Yugui)" <yugui@...>

-----BEGIN PGP SIGNED MESSAGE-----

19 messages 2011/09/24
[#388208] Re: [ANN] Ruby 1.9.3 RC1 is out — Quintus <sutniuq@...> 2011/09/24

-----BEGIN PGP SIGNED MESSAGE-----

[#388209] Re: [ANN] Ruby 1.9.3 RC1 is out — Chris White <cwprogram@...> 2011/09/24

[#388214] Re: [ANN] Ruby 1.9.3 RC1 is out — Quintus <sutniuq@...> 2011/09/24

-----BEGIN PGP SIGNED MESSAGE-----

[#388216] Re: [ANN] Ruby 1.9.3 RC1 is out — Yusuke Endoh <mame@...> 2011/09/24

Hello,

[#388248] Looking for better/familiar approach to command line opts — "Perl J." <perljunkie@...>

So I guess the warning to the reader upfront is... I'm a bit of a Perl

14 messages 2011/09/25

[#388333] Get all classes from a list of files — Jeroen van Ingen <jeroeningen@...>

I have a list of ruby files. I would like to create objects from all

11 messages 2011/09/28

[#388342] Ruby Syntax @keywords ||= [ ] — Bhavesh Sharma <sharmabhavesh@...>

Sorry if this comes across as a dumb question, but what does the

11 messages 2011/09/28

[#388366] IO.readlines will not accept variable with file name Why? — Joda jenson <jodajen2@...>

I am fairly new to Ruby and I am stuck on this. Would someone have a

13 messages 2011/09/29
[#388368] Re: IO.readlines will not accept variable with file name Why? — Robert Klemme <shortcutter@...> 2011/09/29

On Thu, Sep 29, 2011 at 11:14 AM, Joda jenson <jodajen2@yahoo.com> wrote:

Re: Ruby Speed Question

From: Chuck Remes <cremes.devlist@...>
Date: 2011-09-18 19:06:27 UTC
List: ruby-talk #388012
On Sep 18, 2011, at 10:51 AM, Kevin Anon wrote:

> Wrote my first Ruby program recently for a class assignment where we had
> to examine the speed of binary search on various array sizes in 3
> different languages. After a little debugging, I managed to get the code
> working, but the difference in run-time between this and the other 2
> languages is significant enough that I'm wondering if I did something
> wrong.
> 
> This takes 13-14 seconds total, while Java runs in just under a quarter
> of a second and C# runs in well under a hundredth of a second. I'm sure
> some of the slowdown for Ruby is that I'm doing it in JRuby on NetBeans,
> but even running it through a command prompt version of Ruby only
> knocked a second or two off the total runtime.

This general question has been answered quite a few times. Some of these links are a little out of date now but the gist is correct. BTW, JRuby is probably the fastest current runtime and the one with the best chances of reaching Java-like performance. Running it with NetBeans isn't slowing you down though you may want to see if you can configure NetBeans to run JRuby with the --server switch (more aggressive JIT'ing by hotspot).

http://stackoverflow.com/questions/1011460/what-makes-ruby-slow

http://stackoverflow.com/questions/2529852/why-do-people-say-that-ruby-is-slow

http://carboni.ca/blog/p/Another-Cool-Reason-Ruby-is-Slow-implicit-super

You can google for more links if you like.

That said, Ruby is probably never going to be as fast as Java or C#. It has advantages beyond speed such as no compile -> link -> run cycle, better ways to express thought (IMHO), a more English-like readability, etc.

I rewrote your example to take advantage of a few Ruby idioms. Your original was essentially a straight port of the C version (minus the memory management). This version is actually a little bit slower on JRuby (the calls to #not_found?, #found? and #left? add about 20% overhead). Interestingly, this rewrite is *faster* when run on Rubinius than your original code. That's one of the nice things about this ecosystem... there are 3 good choices for Ruby runtimes all with the various strengths & weaknesses.


class BinarySearch

  # main method, tests binary search speed on arrays of varying sizes
  # for each array size, program does the following:
  #    1) fills array with even numbers (index times two)
  #    2) performs 500,000 unsuccessful searches (odd numbers only)
  #    3) reports total time & average time per search
  #    4) brings the array out of scope to remove it from memory
  def initialize
    puts "Data Structures & Algorithms - Assignment 1 - Problem 5 - Ruby\n\n"

    @size = 32
    @list = []
  end

  def run
    while @size < 530_000
      @list.clear
      populate_with_even_numbers

      @check = 0
      elapsed_time = measure_elapsed_time do
        search_for_odd_numbers
      end

      puts "ERROR! Successful search! checksum = #{@check}" if checksum_failure?

      output_results(@size, elapsed_time)
      @size *= 4
    end
  end

  # recursive binary search
  # array = the array to be searched
  # target = what to look for
  # first = the first index of the range
  # last = the last index of the range
  # returns the index of target value, or -1 if not found
  def search(target, first, last)
    return -1 if not_found?(first, last)  # basis (not found)

    middle = (first + last) / 2
    if found?(middle, target)
      middle
    elsif left?(middle, target)
      search(target, first, middle - 1)
    else  # recur on right half
      search(target, middle + 1, last)
    end
  end
  
  def not_found?(first, last)
    first > last
  end
  
  def found?(middle, target)
    @list[middle] == target
  end
  
  def left?(middle, target)
    target < @list[middle]
  end

  def populate_with_even_numbers
    # fills the array with even numbers
    @size.times { |i| @list[i] = 2 * i }
  end

  def measure_elapsed_time(&blk)
    start = Time.now
    yield
    Time.now - start
  end

  def search_for_odd_numbers
    1.step(1_000_000, 2) do |j|
      r = search(j, 0, @list.length - 1)
      @check -= r
    end
  end

  def checksum_failure?
    500_000 != @check
  end

  def output_results(size, elapsed_time)
    puts "Performing 500k searches on an array of length " + size.to_s + " required " +
    elapsed_time.to_s + " seconds, an average of " + (elapsed_time * 2000).to_s +
    " nano-seconds per search"
  end
end



if __FILE__ == $0

  b = BinarySearch.new
  b.run

end


To my eye this reads much better and expresses the execution a bit more clearly.

We hope you stick around and learn more about the language.
 
cr

In This Thread