1

Тема: Швидкість виконання тригонометричних функцій в C# (System.Math)

Хочу трохи показати, скільки часу йде на обчислення функцій { Sin, Cos, Tan, Sinh, Cosh, Tanh, Exp, Sqrt } зі стандартної бібліотеки System.Math, бо в неті такого не знайшов.
https://i.ibb.co/LpXzkqy/Trig-Functions.png
Йдеться не про конкретний час (мілісекунди) і не про такти процесора, а про їх відношення між собою.
Тут наведено дані тестів під MS .NET framework.
Потреба в оцінці часу в мене виникла, коли я бавився з комплексними числами (самописними), і потрібно було вирішити, які функції використовувати.
Як з'явиться вільний час, то ще допишу про { Acos, Asin, Atan, Atan2, Log, Pow }.
Сподіваюсь комусь ця інфо буде корисна.
Було б добре, якби хто навів подібні результати для Mono під Linux...

Post's attachments

SinCosTan_h_TicksCsharp.xls 61 kb, 453 downloads since 2015-12-25 

Подякували: getwisdom, 0xDADA11C72

2

Re: Швидкість виконання тригонометричних функцій в C# (System.Math)

так mono мона і на віндусі потестити ж

3

Re: Швидкість виконання тригонометричних функцій в C# (System.Math)

Перепрошую,а що саме відображають кольори на Вашій схемі?І мені особисто було б цікаво почитати як Ви це обраховували.

Подякували: leofun011

4 Востаннє редагувалося leofun01 (26.12.2015 13:47:05)

Re: Швидкість виконання тригонометричних функцій в C# (System.Math)

FakiNyan написав:

так mono мона і на віндусі потестити ж

можна, але мене цікавить саме продуктивність збірки на Linux.

getwisdom написав:

що саме відображають кольори на Вашій схемі?

Зелений - мінімальний час (серед вибірки середніх значень в таблиці);
Синій, Жовтий - середні значення (серед середніх значень :-).
Червоний - максимальний час (серед вибірки середніх значень в таблиці).

getwisdom написав:

цікаво почитати як Ви це обраховували.

Вибачте за гівнокод, але використання делегатів і словників спотворює результати.

Код (milisec)
#region Millisecond
//
double limit = 6.283185307179586476925286766559d,
    h = 0.0000001d,
    sum = 0d,
    d = 0d;
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Abs(d);
    sum -= System.Math.Abs(d);
}
watch.Stop();
Console.WriteLine(" Abs\t: {0}\t sum : {1}", watch.ElapsedMilliseconds, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Abs(d);
    sum -= System.Math.Abs(d);
}
watch.Stop();
Console.WriteLine(" Abs\t: {0}\t sum : {1}", watch.ElapsedMilliseconds, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Exp(d);
    sum -= System.Math.Exp(d);
}
watch.Stop();
Console.WriteLine(" Exp\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sin(d);
    sum -= System.Math.Sin(d);
}
watch.Stop();
Console.WriteLine(" Sin\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cos(d);
    sum -= System.Math.Cos(d);
}
watch.Stop();
Console.WriteLine(" Cos\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tan(d);
    sum -= System.Math.Tan(d);
}
watch.Stop();
Console.WriteLine(" Tan\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sinh(d);
    sum -= System.Math.Sinh(d);
}
watch.Stop();
Console.WriteLine(" Sinh\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cosh(d);
    sum -= System.Math.Cosh(d);
}
watch.Stop();
Console.WriteLine(" Cosh\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tanh(d);
    sum -= System.Math.Tanh(d);
}
watch.Stop();
Console.WriteLine(" Tanh\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sqrt(d);
    sum -= System.Math.Sqrt(d);
}
watch.Stop();
Console.WriteLine(" Sqrt\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Exp(d);
    sum -= System.Math.Exp(d);
}
watch.Stop();
Console.WriteLine(" Exp\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sin(d);
    sum -= System.Math.Sin(d);
}
watch.Stop();
Console.WriteLine(" Sin\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cos(d);
    sum -= System.Math.Cos(d);
}
watch.Stop();
Console.WriteLine(" Cos\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tan(d);
    sum -= System.Math.Tan(d);
}
watch.Stop();
Console.WriteLine(" Tan\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sinh(d);
    sum -= System.Math.Sinh(d);
}
watch.Stop();
Console.WriteLine(" Sinh\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cosh(d);
    sum -= System.Math.Cosh(d);
}
watch.Stop();
Console.WriteLine(" Cosh\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tanh(d);
    sum -= System.Math.Tanh(d);
}
watch.Stop();
Console.WriteLine(" Tanh\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sqrt(d);
    sum -= System.Math.Sqrt(d);
}
watch.Stop();
Console.WriteLine(" Sqrt\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Exp(d);
    sum -= System.Math.Exp(d);
}
watch.Stop();
Console.WriteLine(" Exp\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sin(d);
    sum -= System.Math.Sin(d);
}
watch.Stop();
Console.WriteLine(" Sin\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cos(d);
    sum -= System.Math.Cos(d);
}
watch.Stop();
Console.WriteLine(" Cos\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tan(d);
    sum -= System.Math.Tan(d);
}
watch.Stop();
Console.WriteLine(" Tan\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sinh(d);
    sum -= System.Math.Sinh(d);
}
watch.Stop();
Console.WriteLine(" Sinh\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cosh(d);
    sum -= System.Math.Cosh(d);
}
watch.Stop();
Console.WriteLine(" Cosh\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tanh(d);
    sum -= System.Math.Tanh(d);
}
watch.Stop();
Console.WriteLine(" Tanh\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//
sum = 0d;
watch = new System.Diagnostics.Stopwatch();
watch.Start();
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sqrt(d);
    sum -= System.Math.Sqrt(d);
}
watch.Stop();
Console.WriteLine(" Sqrt\t: {0}\t sum : {1}", watch.ElapsedMilliseconds - 1300, sum);
//*/
#endregion // Millisecond
Код (ticks)
#region Ticks
//
double limit = 6.283185307179586476925286766559d,
    h = 0.0000001d,
    sum = 0d,
    d = 0d;
long ticks = DateTime.Now.Ticks, t0 = 0L;
for(d = 0d; d < limit; d += h) { sum += d; sum -= d; }
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Plus\t: {0}\t sum : {1}", ticks, sum);
t0 = ticks;
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h) { sum += d; sum -= d; }
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Plus\t: {0}\t sum : {1}", ticks, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += d * d;
    sum += -d * d;
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Mult\t: {0}\t sum : {1}", ticks, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Exp(d);
    sum += System.Math.Exp(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Exp\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sin(d);
    sum += System.Math.Sin(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Sin\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cos(d);
    sum += System.Math.Cos(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Cos\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tan(d);
    sum += System.Math.Tan(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Tan\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sinh(d);
    sum += System.Math.Sinh(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Sinh\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cosh(d);
    sum += System.Math.Cosh(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Cosh\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tanh(d);
    sum += System.Math.Tanh(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Tanh\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sqrt(d);
    sum += System.Math.Sqrt(d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Sqrt\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sin(d);
    sum += System.Math.Sin(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Sin\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cos(d);
    sum += System.Math.Cos(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Cos\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tan(d);
    sum += System.Math.Tan(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Tan\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sinh(d);
    sum += System.Math.Sinh(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Sinh\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cosh(d);
    sum += System.Math.Cosh(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Cosh\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tanh(d);
    sum += System.Math.Tanh(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Tanh\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sqrt(d);
    sum += System.Math.Sqrt(d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Sqrt\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sin(d);
    sum += System.Math.Sin(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Sin\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cos(d);
    sum += System.Math.Cos(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Cos\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tan(d);
    sum += System.Math.Tan(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Tan\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sinh(d);
    sum += System.Math.Sinh(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Sinh\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Cosh(d);
    sum += System.Math.Cosh(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Cosh\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Tanh(d);
    sum += System.Math.Tanh(-d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Tanh\t: {0}\t sum : {1}", ticks - t0, sum);
//
sum = 0d;
ticks = DateTime.Now.Ticks;
for(d = 0d; d < limit; d += h)
{
    sum += System.Math.Sqrt(d);
    sum += System.Math.Sqrt(d);
}
ticks = DateTime.Now.Ticks - ticks;
Console.WriteLine(" Sqrt\t: {0}\t sum : {1}", ticks - t0, sum);
//*/
#endregion // Ticks
Подякували: 0xDADA11C71