Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
For performance, write it in C
There are currently too many topics in this group that display first. To make this topic appear first, remove this option from another topic.
There was an error processing your request. Please try again.
flag
  Messages 1 - 25 of 141 - Collapse all  -  Translate all to Translated (View all originals)   Newer >
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Peter Hickman  
View profile  
 More options Jul 26 2006, 4:47 am
Newsgroups: comp.lang.ruby
From: Peter Hickman <pe...@semantico.com>
Date: Wed, 26 Jul 2006 17:47:13 +0900
Local: Wed, Jul 26 2006 4:47 am
Subject: For performance, write it in C
Whenever the question of performance comes up with scripting languages
such as Ruby, Perl or Python there will be people whose response can be
summarised as "Write it in C". I am one such person. Some people take
offence at this and label us trolls or heretics of the true programming
language (take your pick).

I am assuming here that when people talk about performance they really
mean speed. Some will disagree but this is what I am talking about.

In this post I want to clear some things up and provide benchmarks as to
why you should take "Write it in C" seriously. Personally I like to
write my projects in Ruby or Perl or Python and then convert them to C
to get a performance boost. How much of a boost? Well here I will give
you some hard data and source code so that you can see just how much of
a boost C can give you.

The mini project in question is to generate all the valid Latin squares.
A Latin square is a grid of numbers (lets say a 9 x 9 grid) that has the
numbers 1 to 9 appear only once in each row and column. Sudoku grids are
a subset of Latin squares.

The approach taken is to create a list of all the permutations and then
build up a grid row by row checking that the newly added row does not
conflict with any of the previous rows. If the final row can be added
without problem the solution is printed and the search for the next one
starts. It is in essence depth first search. The first version of the
program that I wrote in Perl took 473 minutes to generate all the valid
5 x 5 Latin squares, version four of the program took 12 minutes and 51
seconds. The C version of the program took 5.5 seconds to produce
identical results. All run on the same hardware.

[Latin]$ time ./Latin1.pl 5 > x5

real    473m45.370s
user    248m59.752s
sys     2m54.598s  

[Latin]$ time ./Latin4.pl 5 > x5

real    12m51.178s
user    12m14.066s
sys     0m7.101s

[Latin]$ time ./c_version.sh 5

real    0m5.519s
user    0m4.585s
sys     0m0.691s

This is what I mean when I say that coding in C will improve the
performance of your program. The improvement goes beyond percentages, it
is in orders of magnitude. I think that the effort is worth it. If a 5 x
5 grid with 120 permutations took 12 minutes in Perl, how long would a 6
* 6 grid with 720 permutations take? What unit of measure would you be
using for a 9 x 9 grid?

Size   Permutations
====   ============
   1              1
   2              2
   3              6
   4             24
   5            120
   6            720
   7           5040
   8          40320
   9         362880

Now lets look at first version of the code:

     1  #!/usr/bin/perl -w

     2  use strict;
     3  use warnings;

     4  use Algorithm::Permute;

     5  my $width_of_board = shift;

     6  my @permutations;

     7  my $p = new Algorithm::Permute( [ 1 .. $width_of_board ] );

     8  while ( my @res = $p->next ) {
     9      push @permutations, [@res];
    10  }
    11  my $number_of_permutations = scalar(@permutations);

    12  for ( my $x = 0 ; $x < $number_of_permutations ; $x++ ) {
    13      add_a_line($x);
    14  }

Lines 1 to 11 just build up a list of all the permutations using the
handy Algorithm::Permute module from CPAN. Lines 12 to 14 starts on the
first row of the solution by trying out all possible permutations for
the first row.

    15  sub add_a_line {
    16      my @lines = @_;

    17      my $size = scalar(@lines);

    18      my $ok = 1;
    19      for ( my $x = 0 ; $x < $size ; $x++ ) {
    20          for ( my $y = 0 ; $y < $size ; $y++ ) {
    21              if ( $x != $y ) {
    22                  $ok = 0 unless compare( $lines[$x], $lines[$y] );
    23              }
    24          }
    25      }

    26      if ($ok) {
    27          if ( $size == $width_of_board ) {
    28              print join(':', map { p($_) } @lines) . "\n";
    29          }
    30          else {
    31              for ( my $x = 0 ; $x < $number_of_permutations ;
$x++ ) {
    32                  add_a_line( @lines, $x );
    33              }
    34          }
    35      }
    36  }

The add_a_line() function first checks that none of the lines so far
conflict (have the same digit in the same column), if it passes and the
number of lines equals the size of the board then the result is printed
and another solution is looked for. Failing that another line is added
and add_a_line() is called.

Here is the function that tells if two lines conflict.

    37  sub compare {
    38      my ( $a, $b ) = @_;

    39      my $ok = 1;

    40      my @aa = @{ $permutations[$a] };
    41      my @bb = @{ $permutations[$b] };

    42      for ( my $x = 0 ; $x < $width_of_board ; $x++ ) {
    43          $ok = 0 if $aa[$x] == $bb[$x];
    44      }

    45      return $ok == 1;
    46  }

The p() function is a little utility to convert a list into a string for
display.

    47  sub p {
    48      my ($x) = @_;

    49      my @a = @{ $permutations[$x] };
    50      my $y = join( '', @a );

    51      return $y;
    52  }

Well I have just exposed some pretty crap code to eternal ridicule on
the internet, but there you have it. The code is crap, even non Perl
programmers will be able to point out the deficenties with this code. It
works, even though a 5 x 5 grid took 473 minutes to run. Lets try and
salvage some pride and show version four and see how we managed to speed
things up.

     1  #!/usr/bin/perl -w

     2  use strict;
     3  use warnings;

     4  use Algorithm::Permute;

     5  my $width_of_board = shift;

     6  my @permutations;
     7  my @output;
     8  my %compared;

     9  my $p = new Algorithm::Permute( [ 1 .. $width_of_board ] );

    10  while ( my @res = $p->next ) {
    11      push @permutations, [@res];
    12      push @output, join( '', @res );
    13  }
    14  my $number_of_permutations = scalar(@permutations);

Lines 1 to 14 are doing pretty much what version one was doing except
that a new list, @output, is being built up to precalculate the output
strings and remove the need for the p() function. A minor speed up but
useful.

    15  for ( my $x = 0 ; $x < $number_of_permutations ; $x++ ) {
    16      for ( my $y = 0 ; $y < $number_of_permutations ; $y++ ) {
    17          my $ok = 1;

    18          my @aa = @{ $permutations[$x] };
    19          my @bb = @{ $permutations[$y] };

    20          for ( my $z = 0 ; $z < $width_of_board ; $z++ ) {
    21              if ( $aa[$z] == $bb[$z] ) {
    22                  $ok = 0;
    23                  last;
    24              }
    25          }

    26          if ( $ok == 1 ) {
    27              $compared{"$x:$y"} = 1;
    28          }
    29      }
    30  }

Lines 15 to 30 introduces new code to precalculate the comparisons and
feed the results into a hash. Lines 31 to 33 start the work in the same
way as version one.

    31  for ( my $x = 0 ; $x < $number_of_permutations ; $x++ ) {
    32      add_a_line($x);
    33  }

And now to the improved add_a_line() function. The code has been
improved to only check that the newly added line does not conflict with
any of the existsing lines rather than repeatedly comparing the existing
(valid) lines.

    34  sub add_a_line {
    35      my @lines = @_;

    36      my $size = scalar(@lines);

    37      my $ok = 1;

    38      if ( $size > 1 ) {
    39          for ( my $x = 0 ; $x < ( $size - 1 ) ; $x++ ) {
    40              unless ( defined $compared{ $lines[$x] .':'.
$lines[-1] } ) {
    41                  $ok = 0;
    42                  last;
    43              }
    44          }
    45      }

    46      if ($ok) {
    47          if ( $size == $width_of_board ) {
    48              print join( ':', map { $output[$_] } @lines ) . "\n";
    49          }
    50          else {
    51              for ( my $x = 0 ; $x < $number_of_permutations ;
$x++ ) {
    52                  add_a_line( @lines, $x );
    53              }
    54          }
    55      }
    56  }

These changes took us down from 473 minutes to just 12. The elimination
of unnessessary comparisons in add_a_line() helped as did the
precalculation of those comparisons. There are lessons to be learnt
here, write decent code and cache repetetive comparisons. There are no
great tricks, just that bad code can cost you dearly and simple things
can bring big improvements. So with such a massive improvement how could
we make our code any faster?

Write it in C.

Having learnt the lessons developing the code in Perl I am not going to
start the whole thing over in C. Using version four I used the
precalculation phase of the Perl scripts to write out a C header file
with data structures that would be useful for the C program.

     1  #define WIDTH_OF_BOARD 5
     2  #define NUMBER_OF_PERMUTATIONS 120
     3  char *output_strings[] = {
     4      "54321",

   123      "12345",
   124  };
   125  bool compared[NUMBER_OF_PERMUTATIONS][NUMBER_OF_PERMUTATIONS] = {
   126      {false, false, ...

   245      {false, false, ...
   246  };
   247  int work[WIDTH_OF_BOARD];

This then leaves the C code itself. Lines 1 to 7 includes a load of
useful stuff, infact it is also probably including some quite
unneccessary stuff too, I just cut and paste it from another project.

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <stdbool.h>
     4  #include <err.h>
     5  #include <string.h>
     6  #include <unistd.h>
     7  #include <sys/types.h>

Line 8 is the header file that Perl precalculated.

     8  #include "Latin.h"

Now the meat. The code is pretty much the same as version four just
adapted to C. No special C tricks, no weird pointer stuff, an almost
line for line translation of the Perl code.

     9  void
    10  add_a_row(int row)
    11  {
    12      bool            is_ok;
    13      int             x,y;

    14      if (row == WIDTH_OF_BOARD) {
    15          for (x = 0; x <
...

read more »


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Dr Nic  
View profile  
 More options Jul 26 2006, 5:03 am
Newsgroups: comp.lang.ruby
From: Dr Nic <drnicwilli...@gmail.com>
Date: Wed, 26 Jul 2006 18:03:10 +0900
Local: Wed, Jul 26 2006 5:03 am
Subject: Re: For performance, write it in C
Do you have any preferred tutorials on wrapping Ruby around C libraries?

--
Posted via http://www.ruby-forum.com/.


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Pit Capitain  
View profile  
 More options Jul 26 2006, 5:23 am
Newsgroups: comp.lang.ruby
From: Pit Capitain <p...@capitain.de>
Date: Wed, 26 Jul 2006 18:23:08 +0900
Local: Wed, Jul 26 2006 5:23 am
Subject: Re: For performance, write it in C
Peter Hickman schrieb:

> (Example of Perl and C Code)

Peter, is there any chance you could test your program with Ruby Inline?

   http://rubyforge.org/projects/rubyinline

I'm on Windows, so I can't use Ruby Inline (+1 for MinGW btw :-)

Regards,
Pit


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
benj...@fysh.org  
View profile  
 More options Jul 26 2006, 5:40 am
Newsgroups: comp.lang.ruby
From: benj...@fysh.org
Date: Wed, 26 Jul 2006 18:40:24 +0900
Local: Wed, Jul 26 2006 5:40 am
Subject: Re: For performance, write it in C
Peter Hickman gave a very good article about prototyping in a scripting
language, and then re-coding in c:

*snip*

> If you really really want that performance boost then take the following
> advice very seriously - "Write it in C".

I totally agree that with the current state of the art, this is the
right approach.

Maybe it doesn't need saying, but I'm going to... in the vasy majority
of applications, almost all of their run time is a tiny wee small
fraction of the code. This is the part that I would write in c (or c++).
The vast majority of the code (and it's not there just for fun, it's
still completely important to the application) will use a vanishingly
small fraction of processor time. This is the bit that I would probably
leave in Ruby.

People talk about the 80:20 principle, but in my experience it's much
more like 99:1 for applications. 99% of the code uses 1% of the run
time. 1% of the code consumes 99% of the run time. That could be the
signal processing and graphics heavy applications that I have
experienced though.

Thanks for the comparison, it was great. And thanks for the very nice
pre-generation of look up tables in perl idea. Nice.

Cheers,
  Benjohn


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
petethebl...@googlemail.com  
View profile  
 More options Jul 26 2006, 5:44 am
Newsgroups: comp.lang.ruby
From: petethebl...@googlemail.com
Date: 26 Jul 2006 02:44:19 -0700
Local: Wed, Jul 26 2006 5:44 am
Subject: Re: For performance, write it in C
It might be interesting to see how Java fares too - another route
again.

Pete


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Tomasz Wegrzanowski  
View profile  
 More options Jul 26 2006, 5:54 am
Newsgroups: comp.lang.ruby
From: "Tomasz Wegrzanowski" <tomasz.wegrzanow...@gmail.com>
Date: Wed, 26 Jul 2006 18:54:02 +0900
Local: Wed, Jul 26 2006 5:54 am
Subject: Re: For performance, write it in C
On 7/26/06, benj...@fysh.org <benj...@fysh.org> wrote:

> Peter Hickman gave a very good article about prototyping in a scripting
> language, and then re-coding in c:

> *snip*

> > If you really really want that performance boost then take the following
> > advice very seriously - "Write it in C".

> I totally agree that with the current state of the art, this is the
> right approach.

Sorry, I just couldn't resist - but maybe you should code Java instead -
http://kano.net/javabench/ ;-)

 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Jay Levitt  
View profile  
 More options Jul 26 2006, 7:26 am
Newsgroups: comp.lang.ruby
From: Jay Levitt <jay+n...@jay.fm>
Date: Wed, 26 Jul 2006 07:26:28 -0400
Local: Wed, Jul 26 2006 7:26 am
Subject: Re: For performance, write it in C

On Wed, 26 Jul 2006 17:47:13 +0900, Peter Hickman wrote:
> In this post I want to clear some things up and provide benchmarks as to
> why you should take "Write it in C" seriously.

This is a great post, and should at least be posted to a blog somewhere so
the masses who don't know about USENET can still find it on Google!

Jay


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Peter Hickman  
View profile  
 More options Jul 26 2006, 7:47 am
Newsgroups: comp.lang.ruby
From: Peter Hickman <pe...@semantico.com>
Date: Wed, 26 Jul 2006 20:47:01 +0900
Local: Wed, Jul 26 2006 7:47 am
Subject: Re: For performance, write it in C

Robert Dober wrote:
> "Hmmm, maybe you should know that this kind of performance is not
> possible in Ruby or even slightly faster interpreted languages, and
> that you
> should consider writing part of it in C, it is not so difficult, have
> a look
> here or there"

> as opposed to those who write

>  "Write it in C if you want speed"

Tact has never been one of my strong points. Your phrasing was much
nicer I will agree. The things that has been bugging me with this whole
performance thing is that I am sure that many people do not realise just
how fast a program written in C can run. The people who seem to take
offence at being told to write their code in C seem to have no
significant experience in using C. What also seems to happen is that
after saying that performance is their number 1 absolute top priority
they start to back peddle saying how hard C code is to develop. Yes is
it harder to work with than a scripting language, it is all the rope you
need to hang yourself with but you can write some blindingly fast code
if you are prepared to put in the effort. Wasn't that what they said was
their number 1 absolute top priority?

 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Peter Hickman  
View profile  
 More options Jul 26 2006, 7:48 am
Newsgroups: comp.lang.ruby
From: Peter Hickman <pe...@semantico.com>
Date: Wed, 26 Jul 2006 20:48:14 +0900
Local: Wed, Jul 26 2006 7:48 am
Subject: Re: For performance, write it in C
Jay Levitt wrote:
> On Wed, 26 Jul 2006 17:47:13 +0900, Peter Hickman wrote:

>> In this post I want to clear some things up and provide benchmarks as to
>> why you should take "Write it in C" seriously.

> This is a great post, and should at least be posted to a blog somewhere so
> the masses who don't know about USENET can still find it on Google!

> Jay

I may well put it in my web site, along with all the source code. Google
and Yahoo hit it enough.

 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Leslie Viljoen  
View profile  
 More options Jul 26 2006, 8:26 am
Newsgroups: comp.lang.ruby
From: "Leslie Viljoen" <leslievilj...@gmail.com>
Date: Wed, 26 Jul 2006 21:26:05 +0900
Local: Wed, Jul 26 2006 8:26 am
Subject: Re: For performance, write it in C
On 7/26/06, Peter Hickman <pe...@semantico.com> wrote:

> Jay Levitt wrote:
> > On Wed, 26 Jul 2006 17:47:13 +0900, Peter Hickman wrote:

> >> In this post I want to clear some things up and provide benchmarks as to
> >> why you should take "Write it in C" seriously.

Something else to consider is the ease with which Ruby extensions can
be written in C. The first time I tried I has something running in 20
minutes.

Though if I was going to choose a (single) language for raw
performance I'd try to go with Pascal or Ada.

Les


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
James Edward Gray II  
View profile  
 More options Jul 26 2006, 10:02 am
Newsgroups: comp.lang.ruby
From: James Edward Gray II <ja...@grayproductions.net>
Date: Wed, 26 Jul 2006 23:02:48 +0900
Local: Wed, Jul 26 2006 10:02 am
Subject: Re: For performance, write it in C
On Jul 26, 2006, at 8:57 AM, Charles O Nutter wrote:

> - Write it in C is as valid as write it in Java (as someone else  
> mentioned).
> Java is at least as fast as C for most algorithms.

I'm Java Certified and I've been hearing people say this for years,  
but I just haven't experienced this myself.  You guys must develop on  
much faster boxes than my MacBook Pro.  ;)

James Edward Gray II


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Peter Hickman  
View profile  
 More options Jul 26 2006, 10:13 am
Newsgroups: comp.lang.ruby
From: Peter Hickman <pe...@semantico.com>
Date: Wed, 26 Jul 2006 23:13:05 +0900
Local: Wed, Jul 26 2006 10:13 am
Subject: Re: For performance, write it in C

Charles O Nutter wrote:
> I'll lob a couple of grenades and then duck for cover.

> - Write it in C is as valid as write it in Java (as someone else
> mentioned).
> Java is at least as fast as C for most algorithms.

As someone who is paid to program in Java I very seriously doubt this.
However I will write a Java version of the code and time it. It should
be interesting to say the least.

> All this said, there's truth to the idea that we shouldn't *have* to
> write
> platform-level code to get reasonable performance, and every effort
> should
> be made to improve the speed of Ruby code as near as possible to that
> of the
> underlying platform code.

We are talking about two different things here. I was talking about
performance as being the number 1 absolute top priority, you are talking
about 'reasonable performance'. As far as I am concerned for those
scripts that I don't convert to C Perl, Ruby and Python are fast enough.
Other people think that they are not, they seem to expect the sort of
performance C gives when they write things in a scripting language. I
think that they are barking.

 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Kroeger, Simon (ext)  
View profile  
 More options Jul 26 2006, 10:18 am
Newsgroups: comp.lang.ruby
From: "Kroeger, Simon (ext)" <simon.kroeger....@siemens.com>
Date: Wed, 26 Jul 2006 23:18:47 +0900
Local: Wed, Jul 26 2006 10:18 am
Subject: Re: For performance, write it in C
Hi Peter!

> Whenever the question of performance comes up with scripting
> languages
> such as Ruby, Perl or Python there will be people whose
> response can be
> summarised as "Write it in C". I am one such person. Some people take
> offence at this and label us trolls or heretics of the true
> programming
> language (take your pick).

The last (and only) time I called someone a troll for saying
'Write it C' it was in response to a rails related question.
Further the OP asked for configuration items and such, but maybe
that's a whole other storry. (and of course you can write
C Extensions for rails... yeah, yadda, yadda :) )

..snip 52 lines Perl, some hundred lines C ...

Just to show the beauty of ruby:
-----------------------------------------------------------
require 'rubygems'
require 'permutation'
require 'set'

$size = (ARGV.shift || 5).to_i

$perms = Permutation.new($size).map{|p| p.value}
$out = $perms.map{|p| p.map{|v| v+1}.join}
$filter = $perms.map do |p|
  s = SortedSet.new
  $perms.each_with_index do |o, i|
    o.each_with_index {|v, j| s.add(i) if p[j] == v}
  end && s.to_a
end

$latins = []
def search lines, possibs
  return $latins << lines if lines.size == $size
  possibs.each do |p|
    search lines + [p], (possibs -
$filter[p]).subtract(lines.last.to_i..p)
  end
end

search [], SortedSet[*(0...$perms.size)]

$latins.each do |latin|
  $perms.each do |perm|
    perm.each{|p| puts $out[latin[p]]}
    puts
  end
end
-----------------------------------------------------------
(does someone has a nicer/even faster version?)

would you please run that on your machine?
perhaps you have to do a "gem install permutation"
(no I don't think it's faster than your C code, but
it should beat the perl version)

> If you really really want that performance boost then take
> the following
> advice very seriously - "Write it in C".

Agreed, 100%, for those who want speed, speed and nothing
else there is hardly a better way.

thanks

Simon


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Francis Cianfrocca  
View profile  
 More options Jul 26 2006, 10:24 am
Newsgroups: comp.lang.ruby
From: Francis Cianfrocca <garbageca...@gmail.com>
Date: Wed, 26 Jul 2006 23:24:07 +0900
Local: Wed, Jul 26 2006 10:24 am
Subject: Re: For performance, write it in C
Peter Hickman wrote:

 > We are talking about two different things here. I was talking about

> performance as being the number 1 absolute top priority, you are talking
> about 'reasonable performance'. As far as I am concerned for those
> scripts that I don't convert to C Perl, Ruby and Python are fast enough.
> Other people think that they are not, they seem to expect the sort of
> performance C gives when they write things in a scripting language. I
> think that they are barking.

I quite agree with this. To Nutter's point, one can make one's own
choice between C and Java once the decision has been made to write
platform-level code. But most code, perhaps nearly all code, should stay
in dyntyped script, in order to optimize the development/runtime
cost-balance. I think you can get tremendous benefits from factoring
code cleverly enough to keep the native-code components as small as
possible. And this is often a nontrivial exercise because it depends on
a good understanding of where performance costs come from in any
particular program.

To the point about Java: as I mentioned upthread, working-set size is
often the key limiting factor in Ruby performance. On a large and busy
server (which is my target environment most of the time), Java can be a
very inappropriate choice for the same reason!

--
Posted via http://www.ruby-forum.com/.


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Ryan McGovern  
View profile  
 More options Jul 26 2006, 10:29 am
Newsgroups: comp.lang.ruby
From: Ryan McGovern <mcgov...@labs.uc.edu>
Date: Wed, 26 Jul 2006 23:29:06 +0900
Local: Wed, Jul 26 2006 10:29 am
Subject: Re: For performance, write it in C
Charles O Nutter wrote:

> Well la-dee-dah! Seriously though, there's a volume of tests and
> benchmarks
> (for what they're worth) that show this to be true, and for
> memory-intensive
> situations Java almost always wins because lazy memory management allows
> work to get done first, faster. Granted, Java's abstractions make it
> easier
> to write bad code...but that's true of every language, including C.

> - Charles Oliver Nutter, CERTIFIED Java Developer

I dont doubt for simple applications and algorithms java is nearly as
fast as C if not equivalent.  Though for larger java projects such as
Eclipse, i've had a horrible time of it being slow and cumbersome on the
system, and Visual Studio will run fine and be far more responsive.
I dont really know why that is it could be as simple as some bad code in
the java gui layer that Eclipse is using.

 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
pat eyler  
View profile  
 More options Jul 26 2006, 10:42 am
Newsgroups: comp.lang.ruby
From: "pat eyler" <pat.ey...@gmail.com>
Date: Wed, 26 Jul 2006 23:42:40 +0900
Local: Wed, Jul 26 2006 10:42 am
Subject: Re: For performance, write it in C
On 7/26/06, Jay Levitt <jay+n...@jay.fm> wrote:

> On Wed, 26 Jul 2006 17:47:13 +0900, Peter Hickman wrote:

> > In this post I want to clear some things up and provide benchmarks as to
> > why you should take "Write it in C" seriously.

> This is a great post, and should at least be posted to a blog somewhere so
> the masses who don't know about USENET can still find it on Google!

well, I didn't post the original post (though I did link to it).  I
did post my take
on it.  At it's core:  write it in Ruby and if it's too slow, profile
it and rewrite the
slow parts (in C if need be).   Rewriting the whole app in C when Ruby makes
cohabitating with C (or C++ or Objective C) so easy just seems pointless.

My post is at  http://on-ruby.blogspot.com/2006/07/rubyinline-making-making-things-f...

> Jay

--
thanks,
-pate
-------------------------
http://on-ruby.blogspot.com

 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Sean O'Halpin  
View profile  
 More options Jul 26 2006, 11:01 am
Newsgroups: comp.lang.ruby
From: "Sean O'Halpin" <sean.ohal...@gmail.com>
Date: Thu, 27 Jul 2006 00:01:11 +0900
Local: Wed, Jul 26 2006 11:01 am
Subject: Re: For performance, write it in C
On 7/26/06, Charles O Nutter <head...@headius.com> wrote:

> there's nothing about a
> language's design that should necessitate it being slower than any other
> language.

While I accept that you shouldn't confuse a language with its implementation,
I find that a mildly surprising statement, especially since you said
in an earlier post:

> for memory-intensive situations Java almost always wins because lazy memory
> management allows work to get done first, faster

Garbage collection seems to me to be an integral part of Java's design.

Off the top of my head, I can think of some other design aspects that
have an effect on performance: method lookup in OO languages, scoping,
continuations, closures, static vs dynamic typing, type inference,
double dispatch, consing + car + cdr in Lisp, direct vs indirect
threading in Forth, etc. These are not just matters of implementation.
Each is a language design decision with a semantic effect which incurs
or avoids a computational cost, regardless of how it's actually
implemented. For example, Ruby has real closures, Python doesn't. I
don't see how you could ever reduce the cost of Ruby having closures
to zero - the memory alone is an implied overhead. Sure you can
optimize till the cows come home but different functionalities have
different costs and you can't ever avoid that.

Regards,
Sean


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Dean Wampler  
View profile  
 More options Jul 26 2006, 11:03 am
Newsgroups: comp.lang.ruby
From: "Dean Wampler" <deanwamp...@gmail.com>
Date: Thu, 27 Jul 2006 00:03:50 +0900
Local: Wed, Jul 26 2006 11:03 am
Subject: Re: For performance, write it in C
On 7/26/06, benj...@fysh.org <benj...@fysh.org> wrote:

> ...

> People talk about the 80:20 principle, but in my experience it's much
> more like 99:1 for applications. 99% of the code uses 1% of the run
> time. 1% of the code consumes 99% of the run time. That could be the
> signal processing and graphics heavy applications that I have
> experienced though.
> ...

This is the "value proposition" of the "Hot Spot" technology in the
Java Virtual Machine. On the fly, it looks for byte code sections that
get executed repeatedly and it then compiles them to object code,
thereby doing runtime optimization. This allows many Java server
processes to run with near-native speeds. When Ruby runs on a virtual
machine, planned for version 2, then Ruby can do that too. The JRuby
project will effectively accomplish the same goal.

--
Dean Wampler
http://www.objectmentor.com
http://www.aspectprogramming.com
http://www.contract4j.org


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Pedro Côrte-Real  
View profile  
 More options Jul 26 2006, 11:07 am
Newsgroups: comp.lang.ruby
From: "Pedro Côrte-Real" <pe...@pedrocr.net>
Date: Thu, 27 Jul 2006 00:07:08 +0900
Local: Wed, Jul 26 2006 11:07 am
Subject: Re: For performance, write it in C
On 7/26/06, Sean O'Halpin <sean.ohal...@gmail.com> wrote:

> Off the top of my head, I can think of some other design aspects that
> have an effect on performance: method lookup in OO languages, scoping,
> continuations, closures, static vs dynamic typing, type inference,
> double dispatch, consing + car + cdr in Lisp, direct vs indirect
> threading in Forth, etc. These are not just matters of implementation.
> Each is a language design decision with a semantic effect which incurs
> or avoids a computational cost, regardless of how it's actually
> implemented. For example, Ruby has real closures, Python doesn't. I
> don't see how you could ever reduce the cost of Ruby having closures
> to zero - the memory alone is an implied overhead. Sure you can
> optimize till the cows come home but different functionalities have
> different costs and you can't ever avoid that.

In theory if two programs in two different languages produce the same
exact results the perfect compilers for each of the languages would
end up producing the same code. In theory practice is the same as
theory but in practice it isn't.

Cheers,

Pedro.


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Kristof Bastiaensen  
View profile  
 More options Jul 26 2006, 11:32 am
Newsgroups: comp.lang.ruby
From: Kristof Bastiaensen <kris...@vleeuwen.org>
Date: Wed, 26 Jul 2006 17:32:15 +0200
Local: Wed, Jul 26 2006 11:32 am
Subject: Re: For performance, write it in C

On Wed, 26 Jul 2006 17:47:13 +0900, Peter Hickman wrote:
> Whenever the question of performance comes up with scripting languages
> such as Ruby, Perl or Python there will be people whose response can be
> summarised as "Write it in C". I am one such person. Some people take
> offence at this and label us trolls or heretics of the true programming
> language (take your pick).

> <snip>

Hi,

When reading your C code, I saw that there is a lot of code that is
generated.  I'd be interested to see how well the C program does if
it can work for any size of the squares. In this case I think the problem
is well suited for logic languages. I wrote a version in the functional
logic language Curry, which does reasonably well.  It will probably not be
faster than the C version, but a lot faster than a program written in
Ruby/Perl/Python.

>If  you really really want that performance boost then take the following
> advice very seriously - "Write it in C".

It can be a good idea to rewrite parts in C, but I would first check if
the algorithms are good, so that it may not even be needed to write any
C code.  And perhaps there are libraries or tools that do the trick
efficiently.  I would keep writing C code as the last option.

Regards,
Kristof

-------------------- start of latin.curry ----------------------------
-- upto is a nondeterministic function that evaluates to
-- a number from 1 upto n
upto 1 = 1
upto n | n > 1 = n ? upto (n-1)

-- check if the lists r s have no element with the same value at the
-- same position
elems_diff r s = and $ zipWith (/=) r s

-- extend takes a list of columns, and extends each column with a
-- number for the next row.  It checks the number agains the column and
-- against the previous numbers in the row.

extend :: [[Int]] -> Int -> [[Int]]
extend cols n = addnum cols [] where
    addnum [] _ = []
    addnum (col:cs) prev
        | x =:= upto n &
          (x `elem` prev) =:= False &
          (x `elem` col) =:= False = (x:col) : addnum cs (x:prev)
        where x free

latin_square n = latin_square_ n
    where latin_square_ 0 = replicate n []  -- initalize columns to nil
          latin_square_ m | m > 0 = extend (latin_square_ (m-1)) n

square2str s = unlines $ map format_col s
    where format_col col = unwords $ map show col

main = mapIO_ (putStrLn . square2str) (findall (\s -> s =:= latin_square 5))
------------------------- end latin.curry -----------------------------


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
vasudevram  
View profile  
 More options Jul 26 2006, 11:19 am
Newsgroups: comp.lang.ruby
From: "vasudevram" <vasudev...@gmail.com>
Date: 26 Jul 2006 08:19:40 -0700
Local: Wed, Jul 26 2006 11:19 am
Subject: Re: For performance, write it in C

> > On Wed, 26 Jul 2006 17:47:13 +0900, Peter Hickman wrote:
> > > In this post I want to clear some things up and provide benchmarks as to
> > > why you should take "Write it in C" seriously.

Interesting series of messages! Got to save and read them through at
leisure ...

Just adding my 2c:

[I worked on a fairly complex performance tuning job once, involving
HP-UNIX boxes (multiple),
Informix ESQL/C batch programs, IBM MQ series (now called Websphere
MQ), UNIX IPC, and got a chance to do tuning at several different
levels - SQL queries, MQ logs/partitions, the C code, algorithms in it,
etc. Was very educational ... just sharing some insights gained from
that, from reading on the subject, and from smaller hobby projects
tuning my own code ...]

[Not implying that previous posters on this thread haven't done any of
the below].

Performance tuning in general is *very* complicated. Guesses or
assumptions like "this code tweak should make it run faster" often do
not work. The only way is a (semi)scientific approach to
measure/profile, study profile results, make hypotheses, change code
accordingly, then re-measure to see if the change made a difference.

Tuning can be done at any of several different levels, ranging from:

- hardware (even here, not just throwing more boxes or faster boxes at
the problem, but things like hardware architecture - obviously only if
the skills are available and the problem is worth the effort)

- software architecture

- algorithms and data structures optimization

- plain code tuning (things like common subexpression elimination, e.g.
using C syntax, changing:

for (i = 0; i < getLength(my_collection); i++) { /* do something with
my_collection[i] */ }

to

collLength = getLength(my_collection);
for (i = 0; i < collLength; i++)  { /* do something with
my_collection[i] */ }

/* which removes the repeated/redundant call to the function
getLength() */

Jon Bentley's book "Writing Efficient Programs" is a very good book
which discusses rules, examples and war stories of tuning at almost all
of these levels, including really excellent advice on code-level
tuning, which may sometimes be the easiest one to implement on existing
code.
Though the examples are in a pseudo-Pascal dialect (easily
understandable for those knowing C), and though it may be out of print
now, for those who have a real need for tuning advice, its worth trying
to get a used copy on eBay, from a friend, whatever.

Its chock-full of code examples with the tuning results (verifiied by
measurement, as stated above), when (and when not) to apply them, and
the war stories are really interesting too ...

Googling for "performance tuning" and variants thereof will help ...

There's another book (for Java, mostly server-side programming) by a
guy called Dov (something - forget his last name and the book title, if
I remember it, will post here) that's *really* excellent too - he shows
(again, with actual measurements) how some of the "expected" results
were actually wrong/counter-intuitive. He worked with IBM on the web
software for one of the recent Olympics.

HTH
Vasudev
--------------------------------------------------------------------------- -------
Vasudev Ram
Custom utility development in UNIX/C/sh/Java/Python/Ruby
Software consulting and training
http://www.dancingbison.com
--------------------------------------------------------------------------- -------


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Peter Hickman  
View profile  
 More options Jul 26 2006, 11:21 am
Newsgroups: comp.lang.ruby
From: Peter Hickman <pe...@semantico.com>
Date: Thu, 27 Jul 2006 00:21:01 +0900
Local: Wed, Jul 26 2006 11:21 am
Subject: Re: For performance, write it in C
I will run your Ruby version and the Java version that I write and post
the results here. Give us a week or so as I have other things to be doing.

 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Doug H  
View profile  
 More options Jul 26 2006, 11:23 am
Newsgroups: comp.lang.ruby
From: "Doug H" <dou...@gmail.com>
Date: 26 Jul 2006 08:23:08 -0700
Local: Wed, Jul 26 2006 11:23 am
Subject: Re: For performance, write it in C

Peter Hickman wrote:
> If you really really want that performance boost then take the following
> advice very seriously - "Write it in C".

Assuming you have no choice but C/C++.   That's why I like using the
jvm or clr with languages like jruby, groovy, or boo.  You don't have
to use C, you can use java or C# or boo itself (since it is statically
typed with type inference): http://boo.codehaus.org/
or C/C++ as well, although it is 100x easier to interface with a C lib
from the clr than it is from jvm with jni.

 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
vasudevram  
View profile  
 More options Jul 26 2006, 11:33 am
Newsgroups: comp.lang.ruby
From: "vasudevram" <vasudev...@gmail.com>
Date: 26 Jul 2006 08:33:52 -0700
Local: Wed, Jul 26 2006 11:33 am
Subject: Re: For performance, write it in C

Interesting ... I read somewhere that the OCaml language, while
higher-level than C (and a functional one too), runs some programs at
least, as fast or faster than C ...
Not sure how true that is ...

Vasudev
http://www.dancingbison.com


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Sean O'Halpin  
View profile  
 More options Jul 26 2006, 11:40 am
Newsgroups: comp.lang.ruby
From: "Sean O'Halpin" <sean.ohal...@gmail.com>
Date: Thu, 27 Jul 2006 00:40:03 +0900
Local: Wed, Jul 26 2006 11:40 am
Subject: Re: For performance, write it in C
On 7/26/06, Pedro Côrte-Real <pe...@pedrocr.net> wrote:

> In theory if two programs in two different languages produce the same
> exact results the perfect compilers for each of the languages would
> end up producing the same code. In theory practice is the same as
> theory but in practice it isn't.

> Cheers,

> Pedro.

In theory, an infinite number of computer scientists hacking for an
infinite amount of time on a keyboard will eventually almost surely
produce a perfect compiler.

In practice, I can't wait that long ;)

Cheers,
Sean


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.
Messages 1 - 25 of 141   Newer >
« Back to Discussions « Newer topic     Older topic »