Hallo,
ich habe mir grade mal eine eigene Sinus-Methode gemacht. Dann habe ich die Zeit von meiner und der der Math-Klasse verglichen.
Komischerweise war meine Methode meistens schneller (sonst gleichschnell). Kann das sein?
Hier mal meine Methode(n):
class Program
{
static void Main(string[] args)
{
DateTime start = DateTime.Now;
Console.WriteLine("Math-Methode: " + Math.Sin(Math.PI / 4));
DateTime end = DateTime.Now;
TimeSpan mathClass = end - start;
start = DateTime.Now;
Console.WriteLine("Eigene Methode: " + Sinus(Math.PI / 4, 64));
end = DateTime.Now;
TimeSpan my = end - start;
string winner = "";
if (my < mathClass)
{
winner = "Meine Methode";
}
else if (my > mathClass)
{
winner = "Die Math-Methode";
}
else if (my == mathClass)
{
winner = "Unentschieden";
}
else
{
winner = "Unbekannt";
}
Console.WriteLine("Geschw. Gewinner: " + winner);
Console.ReadLine();
}
static double Sinus(double a, int b)
{
double x = Potenz(a, 1) / Fakutaet(1);
// true = +
// false = -
bool operation = false;
for (int i = 3; i < b; i += 2)
{
if (!operation)
{
x -= Potenz(a, i) / Fakutaet(i);
}
else
{
x += Potenz(a, i) / Fakutaet(i);
}
operation = !operation;
}
return x;
}
static double Fakutaet(double a)
{
double x = 1;
for (int i = 0; i < a; i++)
{
x *= i + 1;
}
return x;
}
static double Potenz(double a, double b)
{
double x = a;
for (int i = 0; i < b - 1; i++)
{
x *= a;
}
return x;
}
}
Wenn ich das in C++.NET mache müsste es doch dann noch schneller sein!?
mfg.
markus111
Hallo,
Dein Programm ist nicht ganz repräsentativ. Bei einer einmaligen Ausführung spielen zu viele Faktoren eine Rolle. Versuch bspw. mal, Deine Funktion zuerst aufzurufen und danach die Math-Methode.
Du musst die Funktionen sehr viel häufiger aufrufen und die Zeit wahrscheinlich auch genauer mit der Stopwatch bestimmen.
Hallo, ich fürchte leider Zufall
nehm mal das als Main-Funtion:
static void Main( string[ ] args )
{
const int count=500000;
Stopwatch sw = new Stopwatch( );
sw.Start( );
List<double> own = new List<double>( count );
for( int i = 0; i < count; i++ )
{
own.Add( Sinus( Math.PI * 2 * i / count,64 ) );
}
sw.Stop( );
Console.WriteLine( "Eigene Funktion: {0}", sw.Elapsed );
sw.Reset( );
sw.Start( );
List<double> klasse = new List<double>( count );
for( int i = 0; i < count; i++ )
{
klasse.Add( Math.Sin( Math.PI * 2 * i / count ) );
}
sw.Stop( );
Console.WriteLine( "Klasse: {0}", sw.Elapsed );
sw.Reset( );
Console.ReadLine( );
}
Hallo Markus
Komischerweise war meine Methode meistens schneller (sonst gleichschnell). Kann das sein?
Ich denke eher nicht.
Du solltest zum Testen die StopWatch Klasse nehmen und mehrere Durchgänge mit verschiedenen Werten machen (Natürlich bei beiden Tests die gleichen), ansonsten ist das Ergebnis nicht aussagekräftig.
Wenn ich das in C++.NET mache müsste es doch dann noch schneller sein!?
Machs doch einfach 😉
Ich würde sagen, dass du das nicht merkst, und wenn nur um ein Quäntchen.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Bei mir ist immer die Math Methode schneller. Ich hab ne schleife drum gemacht. Bei mir war kein mal die selbstgeschriebene schneller.
Gruß pdelvo
Hallo JAck30lena,
der 2. Parameter gibt die Anzahl der Glieder der Reihendarstellung der Sinusfunktion an.
Edit: Der Sinus ist ja auch darstellbar als sin(x) = x - x3 / 3! + x5 / 5! - x^7 / 7! ...
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Hallo,
ist eigentlich irgendwo dokumentiert wie der Sinus in der Math-Klasse berechnet wird?
Schöne Grüße
Christian
Das Framework wird wohl intern den FSIN-Opcode der CPU nutzen.
Und mit zig Befehlen einer selbstgeschriebenen Sinus-Approximation wirst du wohl kaum schneller sein, als ein fertiger CPU-Befehl.
(Anders siehts aus, wenn du ne LookUpTable machst, die kann unter umständen weniger Takte benötigen als der FSIN-Befehl)
beste Grüße
zommi
Korrekt gemessen ist deine Methode um den Faktor 300 LANGSAMER.
So ineffizient, wie die selbstgeschriebene Sinus-Methode ist, hätte mich auch alles andere gewundert! -)
Allein beim Lesen des Thread-Titels mußte ich schon innerlich lachen (LOL)...
Ich habs auch nicht geglaubt. War ja auch net so...
Ich habe mir grade angeguckt, wie man Sinus berrechnet, da hab ich mich wohl vertan 😜
mfg.
markus111