[#319108] Iterator objects and lazy evaluation — Yuh-Ruey Chen <maian330@...>

Two questions:

14 messages 2008/11/01

[#319117] Poor performance of Ruby 1.8.7 when installed with MacPorts — abc <arcadiorubiogarcia@...>

Hi,

15 messages 2008/11/01

[#319176] Ruby for Philosophers — Sebastian Torena <citizenkant@...>

Hi there,

14 messages 2008/11/02

[#319196] ruby1.9: lazy versions of Enumerator#select and friends? — Brian Candler <b.candler@...>

I've been having a play with Enumerators in ruby 1.9, in particular

12 messages 2008/11/02

[#319239] Rake task for building latex? — Stefano Crocco <stefano.crocco@...>

Does anyone know whether there's a rake task to build latex files, including

10 messages 2008/11/03

[#319319] Ruby's take on S.O.L.I.D. — Mike Lopke <reglopke@...>

I'm curious about everyone's take on Bob Martin's S.O.L.I.D. design

16 messages 2008/11/03

[#319401] Combination of numbers in an array that add up to x — Hae Lee <hae.lee.subscription@...>

Objective: Find list of values in an array that adds up to a specific

17 messages 2008/11/04

[#319404] Showing a spinner ? — Aldric Giacomoni <aldric@...>

How do I show a spinner on the command line interface when a ruby script

13 messages 2008/11/04

[#319440] What would you like to know about JRuby? — Charles Oliver Nutter <charles.nutter@...>

Tom Enebo and I are putting together our JRuby presentation for

22 messages 2008/11/04

[#319532] What's the Best Way to Mimic an HTTP Request? — Daniel Miessler <daniel@...>

I'm trying to write a tool that will take a domain as an argument and

10 messages 2008/11/05

[#319546] Ruby has a Face that it wears on its feet — "Jayson Williams" <williams.jayson@...>

In my opinion, Ruby's official face should be Shoes. Shoes gives Ruby

17 messages 2008/11/05
[#319553] Re: Ruby has a Face that it wears on its feet — "Martin DeMello" <martindemello@...> 2008/11/05

On Wed, Nov 5, 2008 at 11:17 AM, Jayson Williams

[#319576] how to quickly find a string towards the end of a large io object — bwv549 <jtprince@...>

How do I scan starting at the end of a big io object to find a string

12 messages 2008/11/06

[#319702] Sudoku Generator (#182) — Matthew Moss <matt@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

14 messages 2008/11/07

[#319769] implementing mvc - using observer pattern - beginner to OOP — Adam Akhtar <adamtemporary@...>

Hi I started making a simple command line todo list application as a way

10 messages 2008/11/08

[#319770] what's easiest way to compare a Float & BigDecimal (i.e. like a equals mechanism) — "Greg Hauptmann" <greg.hauptmann.ruby@...>

Hi,

8 messages 2008/11/08

[#319835] Moving large amount of files, 1.750.000+ — Sebastian Newstream <abeansits@...>

Hello fellow Rubyists!

15 messages 2008/11/09
[#319837] Re: Moving large amount of files, 1.750.000+ — Robert Klemme <shortcutter@...> 2008/11/09

On 09.11.2008 18:04, Sebastian Newstream wrote:

[#319861] Notepad++ (no debug output, using XP) — Ed Hardy <asm.sol@...>

Notepad++ seems to be a great editor for Ruby, in XP Windows. However,

13 messages 2008/11/10

[#319902] Problem with object methods? — Carter Davis <theshakrah@...>

I recently made an object for a game I'm making. It uses the constructor

16 messages 2008/11/10
[#319908] Re: Problem with object methods? — Hugh Sasse <hgs@...> 2008/11/10

[#319911] Re: Problem with object methods? — Carter Davis <theshakrah@...> 2008/11/10

Okay, I made an example.

[#320057] Convert text string i.e 'Peter' into integer ID — Justus Ohlhaver <ohlhaver@...>

Hello,

23 messages 2008/11/12

[#320101] Issue with block and getting to local variables — Tarek Other <cashew250@...>

Ok I'm new to ruby and want to do the following, I want to define a

12 messages 2008/11/12

[#320103] Need tutoring on using a path environment variable — dkmd_nielsen <donn@...>

I don't know what to do. I have an environment variable, PW_PATH,

11 messages 2008/11/12

[#320135] '#' characters are breaking my regexp — Max Williams <toastkid.williams@...>

I'm trying to build a regexp that includes music notes, eg Bb or C#.

14 messages 2008/11/13

[#320202] Highline - question with multiple choices — szimek <szimek@...>

Hi,

14 messages 2008/11/14
[#320208] Re: Highline - question with multiple choices — James Gray <james@...> 2008/11/14

On Nov 14, 2008, at 4:23 AM, szimek wrote:

[#320270] Re: Highline - question with multiple choices — szimek <szimek@...> 2008/11/15

On 14 Lis, 14:52, James Gray <ja...@grayproductions.net> wrote:

[#320213] Unit Conversion (#183) — Matthew Moss <matt@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

37 messages 2008/11/14

[#320280] IO#lineno= doesn't work the way I expected — Chad Perrin <perrin@...>

I'm working on something that operates on each line of a file

22 messages 2008/11/15
[#320283] Re: IO#lineno= doesn't work the way I expected — Tim Hunter <TimHunter@...> 2008/11/15

Chad Perrin wrote:

[#320286] Re: IO#lineno= doesn't work the way I expected — Chad Perrin <perrin@...> 2008/11/15

On Sun, Nov 16, 2008 at 02:27:45AM +0900, Tim Hunter wrote:

[#320287] Re: IO#lineno= doesn't work the way I expected — "Michael Guterl" <mguterl@...> 2008/11/15

On Sat, Nov 15, 2008 at 2:08 PM, Chad Perrin <perrin@apotheon.com> wrote:

[#320288] Re: IO#lineno= doesn't work the way I expected — "Michael Guterl" <mguterl@...> 2008/11/15

On Sat, Nov 15, 2008 at 2:54 PM, Michael Guterl <mguterl@gmail.com> wrote:

[#320359] Why does tmail stop my CGI script form working? — Chad Perrin <perrin@...>

I decided to try TMail for the back end of a new contact page on a

14 messages 2008/11/17

[#320370] How can I overload a method in Ruby — Zhao Yi <youhaodeyi@...>

This is my class definition:

19 messages 2008/11/17
[#320374] Re: How can I overload a method in Ruby — Einar Magn俍 Boson <einarmagnus@...> 2008/11/17

there is no overloading, only overriding.

[#320417] How to extract links of a particular class type — "Sita Rami Reddy" <sitaramireddy@...>

I have a web page which has n number of links.

11 messages 2008/11/17

[#320446] function to select only certain key/value pairs from hash? — Aryk Grosz <tennisbum2002@...>

Whenever Im coding I usually come across having to create a new hash

14 messages 2008/11/17

[#320482] I don't like specs, should I change my point of view ? — Zouplaz <user@...>

Hello, I'm not trolling. I don't like specs (RSpec) : everytime I had a

18 messages 2008/11/18

[#320500] Should is the new Must? — Trans <transfire@...>

Why did 'should' become the going nomenclature of BDD framworks?

21 messages 2008/11/18

[#320553] Syntax question from a newbie to Ruby — David Spitzer <davidspitzer@...>

I am just learning Ruby and I can not seem to see why the first example

12 messages 2008/11/18

[#320655] build hash by iterating — Jason Lillywhite <jason.lillywhite@...>

I am building a hash this way:

15 messages 2008/11/19

[#320665] Question about host, gethostbyname and getaddress — Vladimir Fekete <fekete@...>

Hi *,

11 messages 2008/11/19

[#320709] ANN: One-Click Ruby Installer 186-27 Release Candidate 2 — Luis Lavena <luislavena@...>

Hello Ruby for Windows users!

11 messages 2008/11/19

[#320811] Found a ruby bug in the URI class, what do I do? — Ben Johnson <bjohnson@...>

I'm pretty sure this is a bug, and it seem so obvious that I'm thinking

9 messages 2008/11/20

[#320908] Befunge (#184) — Matthew Moss <matt@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

28 messages 2008/11/22
[#321031] Re: [QUIZ] Befunge (#184) — Matthew Moss <matt@...> 2008/11/24

Hopefully the quiz isn't intimidating... It's a fairly simple language

[#321006] Can you run a command line script with arguments, without typing 'ruby' first? — "Jayson Williams" <williams.jayson@...>

Hi All,

29 messages 2008/11/24
[#321008] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Diogo Lisboa" <diogoslisboa@...> 2008/11/24

chmod a+x my_script (restrict permissions if you want)

[#321022] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Jayson Williams" <williams.jayson@...> 2008/11/24

I am using win os, so the shabang thing isn't an option for me. I put

[#321023] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Glen Holcomb" <damnbigman@...> 2008/11/24

On Mon, Nov 24, 2008 at 2:12 PM, Jayson Williams

[#321024] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Glen Holcomb" <damnbigman@...> 2008/11/24

On Mon, Nov 24, 2008 at 2:21 PM, Glen Holcomb <damnbigman@gmail.com> wrote:

[#321027] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Jayson Williams" <williams.jayson@...> 2008/11/24

The associations are correct. I reset them just to be sure though. I

[#321095] Re: Can you run a command line script with arguments, without typing 'ruby' first? — Daniel Schömer <daniel.schoemer@...> 2008/11/25

Jayson Williams wrote:

[#321037] Chris Pine tutorial assistance chapter 7 sort data without use of .sort method — jgheal@...

I'm learning to progam and came accross Chris Pine's Ruby Tutorial.

12 messages 2008/11/24

[#321039] Good math/stats libraries for Ruby? — Kenneth McDonald <kenneth.m.mcdonald@...>

There seem to be lots of small stats/math libraries for Ruby, but none

10 messages 2008/11/24

[#321166] time to back peddle? (Ruby 1.8.7) — Trans <transfire@...>

I just updated my Ubuntu system and was a bit surprised to find:

16 messages 2008/11/26

[#321179] How to get a reference to a block (when no explicit block parameter is used?) — Kenneth McDonald <kenneth.m.mcdonald@...>

In a function, I can find out if a block was given using block_given?,

8 messages 2008/11/26

[#321246] Performance issues with large files -- ruby vs. python :) — sa 125 <s_ayalon@...>

Hi all -

16 messages 2008/11/27
[#321248] Re: Performance issues with large files -- ruby vs. python :) — Florian Gilcher <flo@...> 2008/11/27

>

[#321271] Ruby's duck typing — "stephan.zimmer" <stephan.zimmer@...>

I would like to represent certain data by a list; to this end I let

17 messages 2008/11/27

[#321287] Programming Noob Chris Pine Tutorial sorting without use of array.sort method — whisperjim <jgheal@...>

I'm working through the following tutorial http://pine.fm/LearnToProgram/

10 messages 2008/11/27

[#321297] eRuby/erb outside of Rails — Jonny Noog <jonnynoog@...>

Hello,

18 messages 2008/11/28

[#321387] best gui toolkit — Warren Dulnuan <rr3800@...>

What is the best GUI toolkit for Ruby?

32 messages 2008/11/29
[#321397] Re: best gui toolkit — Vladimir Fekete <fekete@...> 2008/11/29

[#321421] Anyone scraping dynamic AJAX sites? — Becca Girl <cschall@...>

Hello.

12 messages 2008/11/30

[#321428] Enumerable#select used to return actual values — Mike Austin <"mike[nospam]"@...>

I'm pretty sure select used to use the actual value of the called block,

36 messages 2008/11/30
[#321432] Re: Enumerable#select used to return actual values — Robert Klemme <shortcutter@...> 2008/11/30

On 30.11.2008 04:46, Mike Austin wrote:

[#321906] Re: Enumerable#select used to return actual values — Mark Thomas <mark@...> 2008/12/04

On Nov 29, 10:46=A0pm, Mike Austin <"mike[nospam]"@mike-austin.com>

[#321912] Re: Enumerable#select used to return actual values — Trans <transfire@...> 2008/12/04

ANN: ThirdBase: A Fast and Easy Date/DateTime Class for Ruby

From: Jeremy Evans <code@...>
Date: 2008-11-22 02:52:28 UTC
List: ruby-talk #320895
= ThirdBase: A Fast and Easy Date/DateTime Class for Ruby

ThirdBase differs from Ruby's standard Date/DateTime class in the
following ways:

- ThirdBase is roughly 2-12 times faster depending on usage
- ThirdBase has a lower memory footprint
- ThirdBase supports pluggable parsers
- ThirdBase doesn't depend on Ruby's Rational class
- ThirdBase always uses the gregorian calendar

== Background

The Ruby standard Date class tries to be all things to all people.
While it does a decent job, it's slow enough to be the bottleneck in
some applications.  If we decide not to care about the Date of
Calendar Reform and the fact that the Astronomical Julian Date differs
from the Julian Date, much of the complexity of Ruby's standard
Date/DateTime class can be removed, and there can be significant
improvements in speed.

== Resources

* {RDoc}[http://third-base.rubyforge.org]
* {Source code}[http://github.com/jeremyevans/third_base]
* {Bug tracking}[http://rubyforge.org/projects/third-base/]

To check out the source code:

  git clone git://github.com/jeremyevans/third_base.git

== Installation

  sudo gem install third_base

== Usage and Compatibility

There are three ways that ThirdBase can be used:

=== Alongside the standard Date/DateTime class

Usage:

  require 'third_base'

If you just require it, you can use ThirdBase::Date and
ThirdBase::DateTime alongside the standard Date and DateTime classes.
This ensures compatibility with all existing software, but doesn't
provide any performance increase to any class not explicitly using
ThirdBase.

=== Replace Date and DateTime with ThirdBase's

Usage:

  require 'third_base'
  include ThirdBase

This is the least compatible method.  It may work for some
applications but will break most, because if they use "require
'date'", they will get a superclass mismatch.  Also ThirdBase::Date is
not completely API compatible with the standard Date class, so it
could break depending on how the application used Date.

If you aren't using any libraries that use ruby's standard Date class,
this is an easy way to be able to use Date and DateTime to refer to
ThirdBase's versions instead of Ruby's standard versions.

Note that rubygems indirectly uses the standard Date class, so if you
want to do this, you'll have to unpack the gem and put it in the
$LOAD_PATH manually.

One case in which this pattern is useful is if you want to use
ThirdBase within your libraries as the date class, but with other
libaries that use the standard version as the date class.  To do this:

  require 'third_base'
  class YourLibrary
    include ThirdBase
    def today
      Date.today
    end
  end

This makes it so that references to Date within YourLibrary use
ThirdBase::Date, while references to Date outside YourLibrary use the
standard Date class.

=== Use ThirdBase's compatibility mode via the third_base executable

Usage:

  $ third_base irb
  $ third_base mongrel_rails
  $ third_base ruby -rdate -e "p Date.ancestors"

This should be used if you want to make all libraries use ThirdBase's
Date class.  Doing this means that even if they "require 'date'", they
will use ThirdBases's versions.  More explicity, it will define Date
and DateTime as subclasses of ThirdBase::Date and ThirdBase::DateTime,
and make them as API compatible as possible.

You could get this by using "require 'third_base/compat'".
Unfortunately, that doesn't work if you are using rubygems (and
ThirdBase is mainly distributed as a gem), because rubygems indirectly
requires date.

The third_base executable modifies the RUBYLIB and RUBYOPT environment
variables and should ensure that even if a ruby library requires
'date', they will get the ThirdBase version with the compatibility
API.  To use the third_base executable, you just prepend it to any
command that you want to run.

This is the middle ground.  It should work for most applications, but
as ThirdBase's compatibility API is not 100% compatible with the
standard Date class, things can still break. See the next section for
some differences.

If you have good unit tests/specs, you can try using this in your
application then running your specs (e.g. third_base rake spec).
Assuming good coverage, if you have no errors, it should be OK to use,
and you'll get a nice speedup.

== Incompatibilities with the standard Date class when using
third_base/compat

* The marshalling format is different
* The new! class methods take different arguments
* Methods which returned rationals now return integers or floats
* ajd and amjd are now considered the same as jd and mjd, respectively
* The gregorian calendar is now the only calendar used
* All parsed two digit years are mapped to a year between 1969 and 2068
* Default parsing may be different, but the user can modify the parsers
used
* Potentially others, but hopefully anything else can be fixed

== Pluggable Parsers

The standard Date class has a hard coded parsing routine that cannot
be easily modified by the user.  ThirdBase uses a different approach,
by allowing the user to add parsers and change the order of parsers.
There are some default parsers built into ThirdBase's Date and
DateTime, and they should work well for the majority of American
users.  However, there is no guarantee that it includes a parser for
the format you want to parse (though you can add a parser that will do
so).

The user should note that ThirdBases's Date and DateTime classes have
completely separate parsers, and modifying one does not affect the
other.

=== Adding Parser Types

ThirdBase's parsers are separated into parser types.  The Date class
has four parser types built in: :iso, :us, :num, and :eu, of which
only :iso, :us, and :num are used by default.   DateTime has all of
the parser types that Date has, and an additional one called :time.

To add a parser type:

  Date.add_parser_type(:mine)
  DateTime.add_parser_type(:mine)

=== Adding Parsers to Parser Types

A ThirdBase Date/Datetime parser consists of two parts, a regular
expression, and a proc that takes a MatchData object and returns a
hash passed to Date/DateTime.new!.  The proc is only called if the
regular expression matches the string to be parsed, and it can return
nil if it is not able to successfully parse the string (even if the
string matches the regular expression).  To add a parser, you use the
add_parser class method, which takes an argument specifying which
parser family to use, the regular expression, and a block that is used
as a proc for the parser:

To add a parser to a parser type:

  Date.add_parser(:mine, /\Atoday\z/i) do |m|
    t = Time.now {:civil=>[t.year, t.mon, t.day]}
  end
  DateTime.add_parser(:mine, /\Anow\z/i) do |m|
    t = Time.now {:civil=>[t.year, t.mon, t.day], :parts=>[t.hour, \
    t.min, t.sec, t.usec], :offset=>t.utc_offset}
  end

Adding a parser to a parser type adds it to the front of the array of
parsers for that type, so it will be tried before other parsers for
that type.  It is an error to add a parser to a parser type that
doesn't exist.

=== Modifying the Order of Parsers Types

You can change the order in which parsers types are tried by using the
use_parsers class method, which takes multiple arguments specifying
the order of parser types:

To modify the order of parser types:

  Date.use_parsers(:mine, :num, :iso, :us)
  DateTime.use_parsers(:time, :iso, :mine, :eu, :num)

== Performance

=== Synthetic Benchmark

  Date vs. ThirdBase::Date: 20000 Iterations
        user     system      total        real
  Date.new                  1.210000   0.000000   1.210000 ( 1.209048)
  ThirdBase::Date.new       0.240000   0.000000   0.240000 ( 0.237548)
  Date.new >>               4.100000   0.010000   4.110000 ( 4.107972)
  ThirdBase::Date.new >>    0.580000   0.010000   0.590000 ( 0.585797)
  Date.new +                1.580000   0.030000   1.610000 ( 1.613447)
  ThirdBase::Date.new +     0.810000   0.000000   0.810000 ( 0.803092)
  Date.parse                6.180000   0.180000   6.360000 ( 6.364501)
  ThirdBase::Date.parse     0.540000   0.000000   0.540000 ( 0.532560)
  Date.strptime             6.680000   0.030000   6.710000 ( 6.707893)
  ThirdBase::Date.strptime  2.200000   0.040000   2.240000 ( 2.241585)

  DateTime vs. ThirdBase::DateTime: 20000 Iterations
        user     system      total        real
  DT.new                  3.490000   0.270000   3.760000 ( 3.760513)
  ThirdBase::DT.new       0.350000   0.000000   0.350000 ( 0.357525)
  DT.new >>               6.720000   0.230000   6.950000 ( 6.953825)
  ThirdBase::DT.new >>    0.840000   0.020000   0.860000 ( 0.854347)
  DT.new +                3.730000   0.170000   3.900000 ( 3.894309)
  ThirdBase::DT.new +     0.780000   0.060000   0.840000 ( 0.834865)
  DT.parse                8.450000   0.400000   8.850000 ( 8.854514)
  ThirdBase::DT.parse     0.980000   0.040000   1.020000 ( 1.015109)
  DT.strptime            10.860000   0.380000  11.240000 (11.243913)
  ThirdBase::DT.strptime  3.410000   0.160000   3.570000 ( 3.574491)

=== Real World Example

ThirdBase was written to solve a real world problem, slow retrieval of
records from a database because they contained many date fields. The
table in question (employees), has 23 fields, 5 of which are date
fields.  Here are the results of selecting all records for the
database via Sequel, both with and without third_base:

  $ script/benchmarker 100 Employee.all
              user     system      total        real
  #1     25.990000   0.040000  26.030000 ( 27.587781)
  $ third_base script/benchmarker 100 Employee.all
              user     system      total        real
  #1     13.640000   0.100000  13.740000 ( 15.018741)

Note that the times above include the time to query the database and
instantiate all of the Model objects.  In this instance you can see
that ThirdBase doubles performance with no change to the existing
code.  This is do to the fact that previously, date-related code took
about 3/4 of the processing time:

ruby-prof graph profile without ThirdBase for Employee.all 100 times:

75.87% 1.05% 101.51 1.40 0.00 100.12 85500 <Class::Date>#new

ruby-prof graph profile with ThirdBase for Employee.all 100 times:

36.43% 1.29%  18.01 0.64 0.00  17.37 85500 <Class::ThirdBase::Date>#new

ThirdBase still takes up over a third of the processing time, but the
total time it takes has been reduced by a factor of 5.  There may be
opportunities to further speed up ThirdBase--while it was designed to
be faster than the default Date class, there have been no attempts to
optimize its performance.

== License

ThirdBase is released under the MIT License.  See the LICENSE file for
details.

== Author

Jeremy Evans <code@jeremyevans.net>
-- 
Posted via http://www.ruby-forum.com/.

In This Thread

Prev Next