2 votes

Optimisation de la loi des Cosinus en VB.net

J'utilise la loi des cosinus dans un programme et il semble que ce soit un point lent de mon code. Voici la ligne de code que j'ai :

Ans = Math.Sqrt(A ^ 2 + B ^ 2 - 2 * A * B * Math.Cos(C - D))

Où A à D sont des variables doubles qui changent à chaque appel. Cette fonction semble prendre environ 2000 ticks pour s'exécuter. J'ai cherché à utiliser l'approximation du petit angle, c'est-à-dire que si (C-D) est suffisamment petit, vous pouvez utiliser cos(C-D) = 1 - ((C-D)^2)/2. Malheureusement, cela s'est avéré être plus lent que le code original. J'ai cherché toutes sortes de relations pouvant être utilisées pour simplifier le calcul, mais A et C sont liés d'une manière complexe et B et D sont liés de la même manière, il n'y a aucune relation entre A et B ou entre C et D.

J'ai pensé à utiliser une fonction de consultation pour toutes les valeurs de (C-D) mais ma précision est actuellement d'au moins 6 chiffres significatifs et je préférerais rester à ce niveau car c'est la précision de mes données d'entrée, en bref, cela signifie environ un million de vaules dans la consultation et ce n'est qu'une section de la fonction. J'ai pensé à avoir une consultation pour les quatre valeurs (A, B, C et D) mais je ne sais pas comment l'implémenter.

J'ai également déjà multithreadé cette application et tenté d'utiliser le GPGPU (le GPGPU s'est avéré plus lent en raison du temps passé à charger et décharger la mémoire du GPU).

Ma question est donc de savoir comment accélérer cette fonction.

Merci d'avance !

3voto

Rob Points 976

Les éléments suivants fonctionnent en moins d'un tiers du temps

ans = Math.Sqrt(a * a + b * b - 2 * a * b * Math.Cos(c - d))

Voici le code qui le prouve :

    Dim sw1 As New Stopwatch
    Dim sw2 As New Stopwatch

    Dim ans, a, b, c, d As Double
    a = 5
    b = 10
    c = 4
    d = 2

    sw1.Start()
    For x As Integer = 1 To 10000
        ans = Math.Sqrt(a ^ 2 + b ^ 2 - 2 * a * b * Math.Cos(c - d))
    Next
    sw1.Stop()

    sw2.Start()
    For y As Integer = 1 To 10000
        ans = Math.Sqrt(a * a + b * b - 2 * a * b * Math.Cos(c - d))
    Next
    sw2.Stop()

    Console.WriteLine(sw1.ElapsedTicks)
    Console.WriteLine(sw2.ElapsedTicks)

    Console.WriteLine(sw2.ElapsedTicks * 100 / sw1.ElapsedTicks)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X