2012-07-31 20:22:27 +03:00
|
|
|
require 'rubygems'
|
2012-06-20 02:20:13 -05:00
|
|
|
require 'bundler/setup'
|
|
|
|
require 'v8'
|
|
|
|
require 'benchmark'
|
2012-06-20 11:56:00 -05:00
|
|
|
require 'optparse'
|
2012-05-22 12:12:08 -05:00
|
|
|
|
2012-06-20 11:56:00 -05:00
|
|
|
OPTIONS = {
|
|
|
|
:times => 5,
|
|
|
|
:mode => :object,
|
|
|
|
:objects => 500
|
|
|
|
}
|
|
|
|
|
|
|
|
parser = OptionParser.new do |opts|
|
|
|
|
opts.on("-t", "--times [T]", Integer, "run benchmark N times") do |t|
|
|
|
|
OPTIONS[:times] = t
|
|
|
|
end
|
2012-05-22 12:12:08 -05:00
|
|
|
|
2012-06-20 11:56:00 -05:00
|
|
|
opts.on("-m", "--mode [MODE]", [:object, :function, :eval], "select the type of object access to stress test") do |mode|
|
|
|
|
mode = mode.to_sym
|
|
|
|
raise "unsupported mode #{mode}" unless [:object,:function,:eval].include?(mode)
|
|
|
|
OPTIONS[:mode] = mode
|
|
|
|
end
|
|
|
|
|
|
|
|
opts.on("-o", "--objects [N]", Integer, "create N objects for each iteration") do |n|
|
|
|
|
OPTIONS[:objects] = n
|
|
|
|
end
|
|
|
|
opts
|
|
|
|
end
|
|
|
|
|
|
|
|
parser.parse! ARGV
|
|
|
|
|
|
|
|
MODE = OPTIONS[:mode]
|
|
|
|
TIMES = OPTIONS[:times]
|
|
|
|
OBJECTS = OPTIONS[:objects]
|
|
|
|
|
|
|
|
puts "using #{OPTIONS[:mode]}"
|
|
|
|
if MODE==:object
|
|
|
|
def get(i)
|
|
|
|
@cxt["test"]["objects"][i]
|
|
|
|
end
|
|
|
|
elsif MODE==:function
|
|
|
|
def get(i)
|
|
|
|
@cxt["test"].getObject(i)
|
|
|
|
end
|
|
|
|
elsif MODE==:eval
|
|
|
|
def get(i)
|
|
|
|
@cxt.eval "test.getObject(#{i})"
|
|
|
|
end
|
|
|
|
end
|
2012-05-22 12:12:08 -05:00
|
|
|
|
|
|
|
js= <<JS
|
|
|
|
|
|
|
|
function createTest()
|
|
|
|
{
|
|
|
|
var test = {};
|
|
|
|
test.objects = [];
|
|
|
|
test.seed = 49734321;
|
|
|
|
test.summ;
|
|
|
|
|
|
|
|
test.random = function()
|
|
|
|
{
|
|
|
|
// Robert Jenkins' 32 bit integer hash function.
|
|
|
|
test.seed = ((test.seed + 0x7ed55d16) + (test.seed << 12)) & 0xffffffff;
|
|
|
|
test.seed = ((test.seed ^ 0xc761c23c) ^ (test.seed >>> 19)) & 0xffffffff;
|
|
|
|
test.seed = ((test.seed + 0x165667b1) + (test.seed << 5)) & 0xffffffff;
|
|
|
|
test.seed = ((test.seed + 0xd3a2646c) ^ (test.seed << 9)) & 0xffffffff;
|
|
|
|
test.seed = ((test.seed + 0xfd7046c5) + (test.seed << 3)) & 0xffffffff;
|
|
|
|
test.seed = ((test.seed ^ 0xb55a4f09) ^ (test.seed >>> 16)) & 0xffffffff;
|
|
|
|
return (test.seed & 0xfffffff) / 0x10000000;
|
|
|
|
};
|
|
|
|
|
|
|
|
test.init = function()
|
|
|
|
{
|
|
|
|
test.objects = [];
|
|
|
|
for(var i=0; i<#{OBJECTS}; i++)
|
|
|
|
{
|
|
|
|
var hash = {};
|
|
|
|
for(var j=0; j<10; j++)
|
|
|
|
{
|
|
|
|
var isString = test.random();
|
|
|
|
var key = "str" + test.random();
|
|
|
|
var value;
|
|
|
|
if(isString < 0.5)
|
|
|
|
value = "str" + test.random();
|
|
|
|
else
|
|
|
|
value = test.random();
|
|
|
|
hash[key] = value;
|
|
|
|
}
|
|
|
|
test.objects[i] = hash;
|
|
|
|
}
|
|
|
|
return test.objects.length;
|
|
|
|
}
|
|
|
|
|
|
|
|
test.findSum = function()
|
|
|
|
{
|
|
|
|
test.summ = 0;
|
|
|
|
var length = test.objects.length;
|
|
|
|
for(var i=0; i<length; i++)
|
|
|
|
{
|
|
|
|
var hash = test.objects[i];
|
|
|
|
for (var k in hash)
|
|
|
|
{
|
|
|
|
if (hash.hasOwnProperty(k) && (typeof(hash[k]) == "number"))
|
|
|
|
{
|
|
|
|
test.summ += hash[k];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return test.summ;
|
|
|
|
};
|
|
|
|
|
|
|
|
test.finalCheck = function()
|
|
|
|
{
|
|
|
|
var summ = 0;
|
|
|
|
var length = test.objects.length;
|
|
|
|
for(var i=0; i<length; i++)
|
|
|
|
{
|
|
|
|
var hash = test.objects[i];
|
|
|
|
for (var k in hash)
|
|
|
|
{
|
|
|
|
if (hash.hasOwnProperty(k) && (typeof(hash[k]) == "number"))
|
|
|
|
{
|
|
|
|
summ += hash[k];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-06-20 11:56:00 -05:00
|
|
|
return summ ;
|
2012-05-22 12:12:08 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
test.getObject = function(index)
|
|
|
|
{
|
|
|
|
if(!test.objects[index]) return {};
|
|
|
|
return test.objects[index];
|
|
|
|
}
|
|
|
|
|
|
|
|
test.setObject = function(index, object)
|
|
|
|
{
|
|
|
|
test.objects[index] = object;
|
|
|
|
}
|
|
|
|
|
|
|
|
return test;
|
|
|
|
}
|
|
|
|
|
|
|
|
JS
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-06-20 11:56:00 -05:00
|
|
|
|
|
|
|
|
2012-05-22 12:12:08 -05:00
|
|
|
def profile
|
|
|
|
Benchmark.realtime do
|
|
|
|
yield
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def get_res result
|
|
|
|
result.to_f
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-06-19 08:28:17 -05:00
|
|
|
|
2012-05-22 12:12:08 -05:00
|
|
|
|
|
|
|
puts "init js context..."
|
|
|
|
cxt = V8::Context.new
|
2012-06-20 11:56:00 -05:00
|
|
|
@cxt=cxt
|
2012-05-22 12:12:08 -05:00
|
|
|
cxt.eval(js)
|
|
|
|
|
2012-06-19 08:28:17 -05:00
|
|
|
cxt.eval('var test = createTest()')
|
2012-05-22 12:12:08 -05:00
|
|
|
|
|
|
|
puts "run init test"
|
|
|
|
result =profile do
|
2012-06-19 08:28:17 -05:00
|
|
|
TIMES.times do
|
|
|
|
cxt['test'].init()
|
|
|
|
end
|
2012-05-22 12:12:08 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
puts "init time: #{get_res(result) / TIMES} sec."
|
2012-06-20 11:56:00 -05:00
|
|
|
sum1=sum2=0
|
2012-05-22 12:12:08 -05:00
|
|
|
puts "run findSum test"
|
2012-06-20 11:56:00 -05:00
|
|
|
|
2012-05-22 12:12:08 -05:00
|
|
|
result =profile do
|
2012-06-19 08:28:17 -05:00
|
|
|
TIMES.times do
|
2012-06-20 11:56:00 -05:00
|
|
|
sum1= cxt['test'].findSum
|
2012-06-19 08:28:17 -05:00
|
|
|
end
|
2012-05-22 12:12:08 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
puts "findSum time: #{get_res(result) / TIMES} sec."
|
|
|
|
|
|
|
|
|
2012-06-20 11:56:00 -05:00
|
|
|
puts "run Objects inversion in ruby test"
|
2012-05-22 12:12:08 -05:00
|
|
|
result =profile do
|
2012-06-19 08:28:17 -05:00
|
|
|
TIMES.times do |j|
|
|
|
|
puts j
|
|
|
|
for i in 0..(OBJECTS-1) do
|
2012-06-20 11:56:00 -05:00
|
|
|
obj = get(i)
|
2012-06-19 08:28:17 -05:00
|
|
|
obj.each do |key, value|
|
|
|
|
if value.instance_of? Float
|
2012-06-20 11:56:00 -05:00
|
|
|
obj[key] = value * (-1)
|
2012-05-22 12:12:08 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
puts "Objects time: #{get_res(result) / TIMES} sec."
|
|
|
|
|
|
|
|
puts "run finalCheck test"
|
2012-06-20 11:56:00 -05:00
|
|
|
|
2012-05-22 12:12:08 -05:00
|
|
|
|
|
|
|
result =profile do
|
2012-06-19 08:28:17 -05:00
|
|
|
TIMES.times do
|
2012-06-20 11:56:00 -05:00
|
|
|
sum2= cxt['test'].findSum
|
2012-06-19 08:28:17 -05:00
|
|
|
end
|
2012-05-22 12:12:08 -05:00
|
|
|
end
|
|
|
|
|
2012-06-20 11:56:00 -05:00
|
|
|
puts "final check time: #{get_res(result) / TIMES} sec."
|
|
|
|
puts "#{sum1==sum2*(TIMES%2==0?1:-1) ? 'TEST PASS': 'TEST FAIL'}: Sum before inversions: #{sum1} / Sum after inversions: #{sum2}"
|