Optymalizacja wyrażeń algebraicznych

Problem z obliczaniem wyrażeń algebraicznych

Przykład z dynamicznym przydziałem pamięci w C#

Porównanie czasów wykonania

Operatory Opt. ręczna
C# 11.08 3.56

Wyrażenia wektorowe

Rozważmy przypadek gdy dla danych skalarów, a, b, c oraz wektorów v1, v2, v3, v4 mamy obliczyć wektor v jako wyrażenie wykorzystujące dodawanie, odejmowanie i mnożenie skalarne wektorów oraz mnożenie wektorów przez skalar:
v=(v1-a*v2+b*v3-c*v4)*
  (c*v1+b*v2+a*v3+v4)*
  (v1-v2-v3+v4)-
v1-a*v2-b*v3+c*v4

Przykład z dynamicznym przydziałem pamięci w C++

Przykład ze statycznym przydziałem pamięci w C++

Porównanie czasów wykonania

Operatory Opt. ręczna
C++ dyn. 46.38 1.44
C++ stat. 5.45 1.33

Unikanie niepotrzebnych obiektów chwilowych poprzez TMP

Klasy operatorowe

Węzły drzewa wyrażenia

Opóźniona ewaluacja operatorów

Przykład: kompilacja wyrażenia v1+v2+v3

Ewaluacja drzew wyrażeń

Końcowy efekt

Kompletny kod przykładu

Przypadek dynamicznego przydziału pamięci

Przypadek statycznego przydziału pamięci

Szablony wyrażeń w C#

Generyki wyrażeń w C#

Optymalizacja obliczania wyrażeń

Przykład wykorzystujący drzewo wyrażenia i generyki w C#

Porównanie czasów wykonania

Operatory Opt. ręczna Gen. wyrażeń
C# 11.08 3.56 4.95
C++ dyn. 46.38 1.44 4.52
C++ stat. 5.45 1.33 2.23