Там есть гуишная тулза (винформс) и консольная. Скармливаешь исходную модель (в виде текста из примеров), меняя шаг интегирования dt, начальное время starttime и конечное stoptime. В гуишной тулзе нажимаешь Run (с сохранением результатов) или Idle Run (холостой ход без сохранения вычисленных результатов). Советую использовать Idle Run для сабжа. В консольной тулзе режима Idle нет.
Исходная модель компилируется и загружается в текущий домен на исполнение. Если dt мало, то время на компиляцию будет незначительно в общем вкладе.
В общем, сама число-дробильня в Mono достаточно неплоха, но в Mono просто отвратительная поддержка хвостовой рекурсии - для некоторых счетных задач это тоже бывает важно (процесс-ориентированное моделирование).
Там система ОДУ всегда компилируется в C#. Можно взять этот промежуточный код (например, через кнопку Generate или запросить у консольной утилиты) и запускать уже самостоятельно. Тогда будет измеряться чистая числодробильня плюс время загрузки байт-кода.
При желании в модель легко добавить синусы и косинусы. Тут по вкусу.
С консольным проектом будут сложности - он сохраняет результаты в файле CSV. Время, необходимое на IO, намного превышает время счета. Само вычисление очень быстрое.
Поэтому все же советую гуевую утилиту, кнопку Idle Run. Практически ничего доделывать не надо. Нужно только выставить dt малым. Сама компиляция занимает меньше секунды.
private static void GenerateCSV (TextReader reader, TextWriter writer, Parameters pars) {
CompSystem system = SystemCompiler.CompileSystem (reader.ReadToEnd(), true);
Verify (system.Domain);
SimulationModel model = CompResolver.Resolve (system.Domain);
SimulationContext ctx = new SimulationContext();
ctx.Method = GetMethod (pars.MethodType);
ctx.Randomness = GetRandomness (pars.RandomnessType);
// тут можно запомнить текущее время
// было так:
// WritingIterator.Iterate (model.Simulate (ctx), writer);
// станет так:
IdleIterator.Iterate (model.Simulate (ctx));
// тут можно снова замерить время и вывести разницу -
// именно столько будет потрачено на вычисления плюс
// небольшое копирование данных в массив, но последнее
// роли большой не играет
}
Да, там некоторое время тратится на копирование результатов интегрирования в буфер. Если хочешь более честных замеров скорости собственно вычислений, то закомментируй следующую строчку в файле ProcessGenerator.cs метода GetIndexIterator:
root@beagleboard:/mnt# mono ./mono_bench.exe
Mono benchmark:
test finished in 3400.879 ms count 10000000
Вот на обычном ноуте x86-ом...
$ mono --version
Mono JIT compiler version 2.6.7 (Debian 2.6.7-5ubuntu3)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
TLS: __thread
GC: Included Boehm (with typed GC and Parallel Mark)
SIGSEGV: altstack
Notifications: epoll
Architecture: x86
Disabled: none
Intel(R) Core(TM) Duo CPU T2600 @ 2.16GHz
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx
constant_tsc arch_perfmon bts aperfmperf pni monitor vmx est tm2 xtpr pdcm dts
bogomips : 4322.41
$ mono ./mono_bench.exe
Mono benchmark:
test finished in 157,181 ms count 10000000
тест такой:
using System;
using System.Timers;
namespace mono_bench
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("Mono benchmark:");
MainClass mc = new MainClass();
DateTime time_start = DateTime.Now;
long count = mc.test001();
DateTime time_end = DateTime.Now;
TimeSpan time_span = time_end - time_start;
Console.WriteLine("test finished in " + time_span.TotalMilliseconds.ToString() + " ms count " + count.ToString());
}
public long test001()
{
long count = 0;
int a = 2, b = 3, c = 4;
for(long i = 0; i < 1E7; i++)
{
a *= 2;
b = a + 3;
c = a - 8;
a = b - 5 + c;
count++;
}
return count;
}
}
}
бинарник один и тот же, пробовал в VirtualBox-е на windows xp на Mono 2.10.2 - такой же результат как и на ноуте Ubuntu, т.е. не виртуальная машина.
3400 мс против 157... это 21.65 раза, хотя по самому тесту можно было ожидать величин, сравнимых с разницей BogoMIPS... т.е. отставание раз 5 не более