[#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> wrote:

[#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: Josh Cheek <josh.cheek@...>
Date: 2011-09-18 18:42:54 UTC
List: ruby-talk #388011
On Sun, Sep 18, 2011 at 10:51 AM, Kevin Anon <oblivious.sage@gmail.com>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.
>
> Ruby code is below, Java & C# code are functionally identical.
>
> # 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(list, target, first = 0, last = list.length-1)
>  return -1 if first>last  # basis (not found)
>  mid = (first+last)/ 2
>  if list[mid]==target  # basis (mid is target)
>    mid
>  elsif target<list[mid]  # recur on left half
>    search(list, target, first, mid-1)
>  else  # recur on right half
>    search(list, target, mid+1, last)
>  end
> end
>
> # 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
> if __FILE__ == $0
>  puts "Data Structures & Algorithms - Assignment 1 - Problem 5 -
> Ruby\n\n"
>  out_a = "Performing 500k searches on an array of length"
>  out_b = "required"
>  out_c = "seconds,\n an average of"
>  out_d = "nano-seconds per search."
>  size = 32
>  while size < 530000
>    list = Array.new
>    i = 0
>    while i<size  # fills the array with even numbers
>      list[i] = 2*i
>      i+=1
>    end
>    j = 1
>    check = 0
>    start = Time.now
>    while j<1000000  # search for odd numbers
>      r = search(list,j)
>      check -= r
>      j+=2
>    end
>    elapsed = Time.now - start  # elapsed time in seconds
>    if check!=500000
>      puts "ERROR! Successful search!  checksum = #{check}"
>    end
>    puts "#{out_a} #{size} #{out_b} #{elapsed} #{out_c} #{elapsed*2000}
> #{out_d}"
>    size *= 4
>  end
> end
>
> --
> Posted via http://www.ruby-forum.com/.
>
>
Java and C# are statically typed and compiled (well... more so than Ruby,
anyway). If your main use case is algorithms, those languages are a better
choice because they will much more performant (Fortran or C probably being
the best choice for such a use case). Though a decent compromise might be
Python, which has a pleasant developer experience like Ruby, but also offers
things like primitives, and has some nice libs for scientific use.


Some reasons differences between the Ruby and Java versions are that Ruby
doesn't have primitives, so all those numbers are objects (ie using Java's
Integer rather than int). Also, if you're using primitive Arrays in the
other languages, that can have an impact, as Ruby's arrays are more like
Java's ArrayLists. Also, the way you check your conditions isn't very
efficient (ie its' more likely to be less / greater than the target than
equal to the target, so by rearranging your checks, you can reduce the run
time -- though obviously not the time complexity).

Anyway, if your goal is just to look at time complexities, then Ruby is
fine, but you aren't really taking advantage of what it has to offer :) Some
simple things like:

Array initialization could be done like this
  Array.new(size) { |index| 2 * index }

Target iteration could be done like this
  (1..1_000_000).step 2 do |target|
    check -= search(list, target)
  end

You could put the search method directly on the arrays (some oppose monkey
patching, but I think this is an okay use case. A good compromise would be
creating a module with this method, then add it only to the arrays you want
to binary search)
  class Array
    def binary_search(target, first = 0, last = length-1)
      return -1 if first > last
      mid = (first+last) / 2
      return binary_search(target, first, mid-1) if target < self[mid]
      return binary_search(target, mid+1, last)  if target > self[mid]
      mid
    end
  end

The string thing is really confusing, you can just do it like this:
  puts "Performing 500k searches on an array of length #{size} required
#{elapsed} seconds,"
  puts " an average of #{elapsed*2000} nano-seconds per search"

Of course, this is just scratching the surface, this really isn't Ruby's
primary domain, so it hasn't got much opportunity to shine in this case.

In This Thread