diff options
Diffstat (limited to 'vendor/ruby-ole/Rakefile')
-rw-r--r-- | vendor/ruby-ole/Rakefile | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/vendor/ruby-ole/Rakefile b/vendor/ruby-ole/Rakefile new file mode 100644 index 000000000..1153bb39a --- /dev/null +++ b/vendor/ruby-ole/Rakefile @@ -0,0 +1,209 @@ +require 'rake/rdoctask' +require 'rake/testtask' +require 'rake/packagetask' +require 'rake/gempackagetask' + +require 'rbconfig' +require 'fileutils' + +$:.unshift 'lib' + +require 'ole/storage' + +PKG_NAME = 'ruby-ole' +PKG_VERSION = Ole::Storage::VERSION + +task :default => [:test] + +Rake::TestTask.new do |t| + t.test_files = FileList["test/test_*.rb"] + t.warning = true + t.verbose = true +end + +begin + require 'rcov/rcovtask' + # NOTE: this will not do anything until you add some tests + desc "Create a cross-referenced code coverage report" + Rcov::RcovTask.new do |t| + t.test_files = FileList['test/test*.rb'] + t.ruby_opts << "-Ilib" # in order to use this rcov + t.rcov_opts << "--xrefs" # comment to disable cross-references + t.verbose = true + end +rescue LoadError + # Rcov not available +end + +Rake::RDocTask.new do |t| + t.rdoc_dir = 'doc' + t.rdoc_files.include 'lib/**/*.rb' + t.rdoc_files.include 'README', 'ChangeLog' + t.title = "#{PKG_NAME} documentation" + t.options += %w[--line-numbers --inline-source --tab-width 2] + t.main = 'README' +end + +spec = Gem::Specification.new do |s| + s.name = PKG_NAME + s.version = PKG_VERSION + s.summary = %q{Ruby OLE library.} + s.description = %q{A library for easy read/write access to OLE compound documents for Ruby.} + s.authors = ['Charles Lowe'] + s.email = %q{aquasync@gmail.com} + s.homepage = %q{http://code.google.com/p/ruby-ole} + s.rubyforge_project = %q{ruby-ole} + + s.executables = ['oletool'] + s.files = ['README', 'Rakefile', 'ChangeLog', 'data/propids.yaml'] + s.files += FileList['lib/**/*.rb'] + s.files += FileList['test/test_*.rb', 'test/*.doc'] + s.files += FileList['test/oleWithDirs.ole', 'test/test_SummaryInformation'] + s.files += FileList['bin/*'] + s.test_files = FileList['test/test_*.rb'] + + s.has_rdoc = true + s.extra_rdoc_files = ['README', 'ChangeLog'] + s.rdoc_options += [ + '--main', 'README', + '--title', "#{PKG_NAME} documentation", + '--tab-width', '2' + ] +end + +Rake::GemPackageTask.new(spec) do |t| + t.gem_spec = spec + t.need_tar = true + t.need_zip = false + t.package_dir = 'build' +end + +desc 'Run various benchmarks' +task :benchmark do + require 'benchmark' + require 'tempfile' + require 'ole/file_system' + + # should probably add some read benchmarks too + def write_benchmark opts={} + files, size = opts[:files], opts[:size] + block_size = opts[:block_size] || 100_000 + block = 0.chr * block_size + blocks, remaining = size.divmod block_size + remaining = 0.chr * remaining + Tempfile.open 'ole_storage_benchmark' do |temp| + Ole::Storage.open temp do |ole| + files.times do |i| + ole.file.open "file_#{i}", 'w' do |f| + blocks.times { f.write block } + f.write remaining + end + end + end + end + end + + Benchmark.bm do |bm| + bm.report 'write_1mb_1x5' do + 5.times { write_benchmark :files => 1, :size => 1_000_000 } + end + + bm.report 'write_1mb_2x5' do + 5.times { write_benchmark :files => 1_000, :size => 1_000 } + end + end +end + +=begin + +1.2.1: + + user system total real +write_1mb_1x5 73.920000 8.400000 82.320000 ( 91.893138) + +revision 17 (speed up AllocationTable#free_block by using +@sparse attribute, and using Array#index otherwise): + + user system total real +write_1mb_1x5 57.910000 6.190000 64.100000 ( 66.207993) +write_1mb_2x5266.310000 31.750000 298.060000 (305.877203) + +add in extra resize_chain fix (return blocks to avoid calling +AllocationTable#chain twice): + + user system total real +write_1mb_1x5 43.140000 5.480000 48.620000 ( 51.835942) + +add in RangesIOResizeable fix (cache @blocks, to avoid calling +AllocationTable#chain at all when resizing now, just pass it +to AllocationTable#resize_chain): + + user system total real +write_1mb_1x5 29.770000 5.180000 34.950000 ( 39.916747) + +40 seconds is still a really long time to write out 5 megs. +of course, this is all with a 1_000 byte block size, which is +a very small wite. upping this to 100_000 bytes: + + user system total real +write_1mb_1x5 0.540000 0.130000 0.670000 ( 1.051862) + +so it seems that that makes a massive difference. so i really +need buffering in RangesIO if I don't want it to really hurt +for small writes, as all the resize code is kind of expensive. + +one of the costly things at the moment, is RangesIO#offset_and_size, +which is called for each write, and re-finds which range we are in. +that should obviously be changed, to a fixed one that is invalidated +on seeks. buffering would hide that problem to some extent, but i +should fix it anyway. + +re-running the original 1.2.1 with 100_000 byte block size: + + user system total real +write_1mb_1x5 15.590000 2.230000 17.820000 ( 18.704910) + +so there the really badly non-linear AllocationTable#resize_chain is +being felt. + +back to current working copy, running full benchmark: + + user system total real +write_1mb_1x5 0.530000 0.150000 0.680000 ( 0.708919) +write_1mb_2x5227.940000 31.260000 259.200000 (270.200960) + +not surprisingly, the second case hasn't been helped much by the fixes +so far, as they only really help multiple resizes and writes for a file. +this could be pain in the new file system code - potentially searching +through Dirent#children at creation time. + +to test, i'll profile creating 1_000 files, without writing anything: + + user system total real +write_1mb_2x5 16.990000 1.830000 18.820000 ( 19.900568) + +hmmm, so thats not all of it. maybe its the initial chain calls, etc? +writing 1 byte: + + user system total real +write_1mb_1x5 0.520000 0.120000 0.640000 ( 0.660638) +write_1mb_2x5 19.810000 2.280000 22.090000 ( 22.696214) + +weird. + +100 bytes: + + user system total real +write_1mb_1x5 0.560000 0.140000 0.700000 ( 1.424974) +write_1mb_2x5 22.940000 2.840000 25.780000 ( 26.556346) + +500 bytes: + + user system total real +write_1mb_1x5 0.530000 0.150000 0.680000 ( 1.139738) +write_1mb_2x5 77.260000 10.130000 87.390000 ( 91.671086) + +what happens there? very strange. + +=end + |