Laden...

Eigene Sinus-Funktion schneller als die Math.Sin()-Methode?????

Erstellt von markus111 vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.581 Views
markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren
Eigene Sinus-Funktion schneller als die Math.Sin()-Methode?????

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

[Follow me on Twitter](http://twitter.com/blendingsky)
U
1.688 Beiträge seit 2007
vor 15 Jahren

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.

C
43 Beiträge seit 2008
vor 15 Jahren

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( );
}
5.941 Beiträge seit 2005
vor 15 Jahren

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

1.346 Beiträge seit 2008
vor 15 Jahren

Bei mir ist immer die Math Methode schneller. Ich hab ne schleife drum gemacht. Bei mir war kein mal die selbstgeschriebene schneller.

Gruß pdelvo

Gelöschter Account
vor 15 Jahren

was ist das für eine komische sinusfunktion? warum nimmt die als 2. argument noch ein integer?

1.002 Beiträge seit 2007
vor 15 Jahren

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

Gelöschter Account
vor 15 Jahren

aber dann ist die eigene sienusfunktion nciht gleichwertig zu der aus der Math klasse.

C
43 Beiträge seit 2008
vor 15 Jahren

Hallo,
ist eigentlich irgendwo dokumentiert wie der Sinus in der Math-Klasse berechnet wird?
Schöne Grüße
Christian

1.361 Beiträge seit 2007
vor 15 Jahren

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

S
8.746 Beiträge seit 2005
vor 15 Jahren

Korrekt gemessen ist deine Methode um den Faktor 300 LANGSAMER.

4.942 Beiträge seit 2008
vor 15 Jahren

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)...

markus111 Themenstarter:in
479 Beiträge seit 2008
vor 15 Jahren

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

[Follow me on Twitter](http://twitter.com/blendingsky)