<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -3,18 +3,29 @@ module VersionSorter
   extend self
 
   def sort(list)
+    @version_numbers ||= {}
+    @version_strings ||= {}
+    @infinity = 1.0/0.0
     list.sort_by {|x| normalize(x)}
   end
 
   def rsort(list)
-    list.sort_by {|x| normalize(x)}.reverse
+    sort(list).reverse
   end
 
 private
 
   def normalize(version)
-    version.scan(/(\d+)|([^\d\.-]+)/).map {|n, x|
-      n ? [n.to_i] : [1.0/0.0, x]}
+    version.scan(/(\d+)|([a-z]+)/i).map {|n, s| n ? normal_number(n) : normal_string(s)}
+  end
+
+  def normal_number(n)
+    n = n.to_i
+    @version_numbers[n] || (@version_numbers[n] = [n])
+  end
+
+  def normal_string(s)
+    @version_strings[s] || (@version_strings[s] = [@infinity, s])
   end
 
 end
@@ -47,6 +58,7 @@ if $0 == __FILE__
   count = 10
   Benchmark.bm(20) do |x|
     x.report(&quot;sort&quot;)             { count.times { VersionSorter.sort(versions) } }
+    x.report(&quot;reverse&quot;)          { count.times { VersionSorter.rsort(versions) } }
   end
   puts
 </diff>
      <filename>version_sorter.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>3de218818c4b1e5fa23dfd56736f01a452376a70</id>
    </parent>
  </parents>
  <author>
    <name>Josh Susser</name>
    <email>josh@hasmanythrough.com</email>
  </author>
  <url>http://github.com/joshsusser/version_sorter/commit/eaa3dbdec2bc6edfc2183cb75aae14467f52d87e</url>
  <id>eaa3dbdec2bc6edfc2183cb75aae14467f52d87e</id>
  <committed-date>2009-10-09T18:08:17-07:00</committed-date>
  <authored-date>2009-10-09T18:08:17-07:00</authored-date>
  <message>Use memoization to avoid object allocation</message>
  <tree>ff392853269adf0f50dfcc1bbb2d143ab9b61d21</tree>
  <committer>
    <name>Josh Susser</name>
    <email>josh@hasmanythrough.com</email>
  </committer>
</commit>
