Я бегу Рубин 2.2 в RubyMine 8.0.3доли миллисекунды в Рубине
Моя машина работает Windows 7 Pro с ядром Intel i7-4710MQ
Я был в состоянии достичь ~ 411 ns с C++, Java, Python и JS на этой машине, но, похоже, не может найти способ достичь этой производительности в Ruby, поскольку встроенная библиотека Time хороша только для ms.
Я могу запрограммировать свои тесты, чтобы вытерпеть эту уменьшенную точность, но можно ли включить API QPC Windows для улучшения оценки времени выполнения?
Мой тестовый код для определения точности часы тик ниже:
numTimes = 10000
times = Array.new(numTimes)
(0...(numTimes)).each do |i|
times[i] = Time.new
end
durations = []
(0...(numTimes - 1)).each do |i|
durations[i] = times[i+1] - times[i]
end
# Output duration only if the clock ticked over
durations.each do |duration|
if duration != 0
p duration.to_s + ','
end
end
Код ниже включает в себя QPC, как нашел here
require "Win32API"
QueryPerformanceCounter = Win32API.new("kernel32",
"QueryPerformanceCounter", 'P', 'I')
QueryPerformanceFrequency = Win32API.new("kernel32",
"QueryPerformanceFrequency", 'P', 'I')
def get_ticks
tick = ' ' * 8
get_ticks = QueryPerformanceCounter.call(tick)
tick.unpack('q')[0]
end
def get_freq
freq = ' ' * 8
get_freq = QueryPerformanceFrequency.call(freq)
freq.unpack('q')[0]
end
def get_time_diff(a, b)
# This function takes two QPC ticks
(b - a).abs.to_f/(get_freq)
end
numTimes = 10000
times = Array.new(numTimes)
(0...(numTimes)).each do |i|
times[i] = get_ticks
end
durations = []
(0...(numTimes - 1)).each do |i|
durations[i] = get_time_diff(times[i+1], times[i])
end
durations.each do |duration|
p (duration * 1000000000).to_s + ','
end
Этот код возвращает длительностей между клещами ~ 22-75 микросекунд на моей машине
Что вы пытаетесь достичь с помощью этого кода? Бенчмаркинг? Кроме того, я думаю, что у вас синтаксическая ошибка. 'if duration u! = 0' – Schwern
Хороший улов, должен был проскользнуть, пока я редактировал представление. Я использую этот код времени для проверки производительности таймера. Я буду использовать таймер для измерения продолжительности инициализации матрицы и умножения для различных размеров NxN. –
Считаете ли вы использование [Benchmark] (http://ruby-doc.org/stdlib-2.3.0/libdoc/benchmark/rdoc/Benchmark.html)? – Schwern