[#14696] Inconsistency in rescuability of "return" — Charles Oliver Nutter <charles.nutter@...>

Why can you not rescue return, break, etc when they are within

21 messages 2008/01/02
[#14699] Re: Inconsistency in rescuability of "return" — Gary Wright <gwtmp01@...> 2008/01/02

[#14738] Enumerable#zip Needs Love — James Gray <james@...>

The community has been building a Ruby 1.9 compatibility tip list on

15 messages 2008/01/03
[#14755] Re: Enumerable#zip Needs Love — Martin Duerst <duerst@...> 2008/01/04

Hello James,

[#14772] Manual Memory Management — Pramukta Kumar <prak@...>

I was thinking it would be nice to be able to free large objects at

36 messages 2008/01/04
[#14788] Re: Manual Memory Management — Marcin Raczkowski <mailing.mr@...> 2008/01/05

I would only like to add that RMgick for example provides free method to

[#14824] Re: Manual Memory Management — MenTaLguY <mental@...> 2008/01/07

On Sat, 5 Jan 2008 15:49:30 +0900, Marcin Raczkowski <mailing.mr@gmail.com> wrote:

[#14825] Re: Manual Memory Management — "Evan Weaver" <evan@...> 2008/01/07

Python supports 'del reference', which decrements the reference

[#14838] Re: Manual Memory Management — Marcin Raczkowski <mailing.mr@...> 2008/01/08

Evan Weaver wrote:

[#14911] Draft of some pages about encoding in Ruby 1.9 — Dave Thomas <dave@...>

Folks:

24 messages 2008/01/10

[#14976] nil encoding as synonym for binary encoding — David Flanagan <david@...>

The following just appeared in the ChangeLog

37 messages 2008/01/11
[#14977] Re: nil encoding as synonym for binary encoding — Yukihiro Matsumoto <matz@...> 2008/01/11

Hi,

[#14978] Re: nil encoding as synonym for binary encoding — Dave Thomas <dave@...> 2008/01/11

[#14979] Re: nil encoding as synonym for binary encoding — David Flanagan <david@...> 2008/01/11

Dave Thomas wrote:

[#14993] Re: nil encoding as synonym for binary encoding — Dave Thomas <dave@...> 2008/01/11

[#14980] Re: nil encoding as synonym for binary encoding — Gary Wright <gwtmp01@...> 2008/01/11

[#14981] Re: nil encoding as synonym for binary encoding — Yukihiro Matsumoto <matz@...> 2008/01/11

Hi,

[#14995] Re: nil encoding as synonym for binary encoding — David Flanagan <david@...> 2008/01/11

Yukihiro Matsumoto writes:

[#15050] how to "borrow" the RDoc::RubyParser and HTMLGenerator — Phlip <phlip2005@...>

Core Rubies:

17 messages 2008/01/13
[#15060] Re: how to "borrow" the RDoc::RubyParser and HTMLGenerator — Eric Hodel <drbrain@...7.net> 2008/01/14

On Jan 13, 2008, at 08:54 AM, Phlip wrote:

[#15062] Re: how to "borrow" the RDoc::RubyParser and HTMLGenerator — Phlip <phlip2005@...> 2008/01/14

Eric Hodel wrote:

[#15073] Re: how to "borrow" the RDoc::RubyParser and HTMLGenerator — Eric Hodel <drbrain@...7.net> 2008/01/14

On Jan 13, 2008, at 20:35 PM, Phlip wrote:

[#15185] Friendlier methods to compare two Time objects — "Jim Cropcho" <jim.cropcho@...>

Hello,

10 messages 2008/01/22

[#15194] Can large scale projects be successful implemented around a dynamic programming language? — Jordi <mumismo@...>

A good article I have found (may have been linked by slashdot, don't know)

8 messages 2008/01/24

[#15248] Symbol#empty? ? — "David A. Black" <dblack@...>

Hi --

24 messages 2008/01/28
[#15250] Re: Symbol#empty? ? — Yukihiro Matsumoto <matz@...> 2008/01/28

Hi,

Ruby 1.9: PATCH: Fixnum#gcd (Reprise)

From: Kurt Stephens <ks@...>
Date: 2008-01-17 03:18:43 UTC
List: ruby-core #15114
I'm reposting this as it appears no one except Ryan had any comments. :)

We find this to be very helpful.  Its a simple patch but it has big
performance implications.

This could be applied to 1.8, as well.

Kurt Stephens
http://kurtstephens.com

==============================================================

See the attached patch.

Much Love to Ruby,
Kurt Stephens

=======================================================

Date uses Rational heavily, which calls Integer#gcd for every new Rational.
The Integer#gcd method is generic to handle Bignums,
but performs terribly for Fixnum#gcd(Fixnum),
which is probably the most often case.

This hack saved 15% execution time in a large Rails application.

See http://kurtstephens.com/node/34

=======================
# fixnum_gcd_test.rb

require 'benchmark'
require 'rational'

srand(1212398)

args = (0...10000).map do | x |
  [ rand(100000), rand(100000) ]
end
# puts args.inspect

Benchmark.bmbm do | bm |
  bm.report("Fixnum#gcd") do
    100.times do
      args.each do | x, y |
        x.gcd(y)
      end
    end
  end
end

=======================

 > ruby-trunk/ruby fixnum_gcd_test.rb
Rehearsal ----------------------------------------------
Fixnum#gcd   1.160000   0.000000   1.160000 (  1.191571)
------------------------------------- total: 1.160000sec

                 user     system      total        real
Fixnum#gcd   1.160000   0.010000   1.170000 (  1.203422)

 > ruby-trunk-orig/ruby fixnum_gcd_test.rb
Rehearsal ----------------------------------------------
Fixnum#gcd   3.980000   0.000000   3.980000 (  4.089624)
------------------------------------- total: 3.980000sec

                 user     system      total        real
Fixnum#gcd   3.960000   0.000000   3.960000 (  4.031807)



Attachments (1)

ruby-trunk.fixnum-gcd.patch (2.75 KB, text/x-patch)
--- ruby-trunk-orig/numeric.c	2007-12-12 12:58:00.000000000 -0600
+++ ruby-trunk/numeric.c	2007-12-13 11:33:51.000000000 -0600
@@ -2316,10 +2316,85 @@
       default:
 	return rb_num_coerce_bin(x, y);
     }
 }
 
+/*
+
+Date uses Rational heavily, which calls Integer#gcd for every new Rational. 
+The Integer#gcd method is generic to handle Bignums, 
+but performs terribly for Fixnum#gcd(Fixnum), 
+which is probably the most often case.
+
+This hack saved 15% execution time in a large Rails application.
+
+See http://kurtstephens.com/node/34
+
+=======================
+# fixnum_gcd_test.rb
+
+require 'benchmark'
+require 'rational'
+
+srand(1212398)
+
+args = (0...10000).map do | x |
+  [ rand(100000), rand(100000) ]
+end
+# puts args.inspect
+
+Benchmark.bmbm do | bm |
+  bm.report("Fixnum#gcd") do
+    100.times do 
+      args.each do | x, y |
+        x.gcd(y)
+      end
+    end
+  end
+end
+
+=======================
+
+ > ruby-trunk/ruby fixnum_gcd_test.rb 
+Rehearsal ----------------------------------------------
+Fixnum#gcd   1.160000   0.000000   1.160000 (  1.191571)
+------------------------------------- total: 1.160000sec
+
+                 user     system      total        real
+Fixnum#gcd   1.160000   0.010000   1.170000 (  1.203422)
+ > ruby-trunk-orig/ruby fixnum_gcd_test.rb 
+Rehearsal ----------------------------------------------
+Fixnum#gcd   3.980000   0.000000   3.980000 (  4.089624)
+------------------------------------- total: 3.980000sec
+
+                 user     system      total        real
+Fixnum#gcd   3.960000   0.000000   3.960000 (  4.031807)
+
+*/
+
+static VALUE 
+fix_gcd(int argc, VALUE *argv, VALUE self) {
+  if ( argc != 1 ) {
+    rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, 1);
+  }
+  if ( FIXNUM_P(argv[0]) ) {
+    /* fprintf(stderr, "Using Fixnum#gcd(Fixnum)\n"); */
+    long a = FIX2LONG(self);
+    long b = FIX2LONG(argv[0]);
+    long min = a < 0 ? - a : a;
+    long max = b < 0 ? - b : b;
+    while ( min > 0 ) {
+      long tmp = min;
+      min = max % min;
+      max = tmp;
+    }
+    return LONG2FIX(max);
+  } else {
+    return rb_call_super(1, argv);
+  }
+}
+
 static VALUE
 int_pow(long x, unsigned long y)
 {
     int neg = x < 0;
     long z = 1;
@@ -3151,10 +3226,11 @@
     rb_define_method(rb_cFixnum, "%", fix_mod, 1);
     rb_define_method(rb_cFixnum, "modulo", fix_mod, 1);
     rb_define_method(rb_cFixnum, "divmod", fix_divmod, 1);
     rb_define_method(rb_cFixnum, "quo", fix_quo, 1);
     rb_define_method(rb_cFixnum, "fdiv", fix_quo, 1);
+    rb_define_method(rb_cFixnum, "gcd", (VALUE(*)(ANYARGS)) fix_gcd, -1);
     rb_define_method(rb_cFixnum, "**", fix_pow, 1);
 
     rb_define_method(rb_cFixnum, "abs", fix_abs, 0);
 
     rb_define_method(rb_cFixnum, "==", fix_equal, 1);

In This Thread

Prev Next