2008-10-02 13 views
6

Czy kompilator zoptymalizuje wszelkie multiplikacje o 1? To jest, rozważ:Optymalizacja mnożenia .NET

int a = 1; 
int b = 5 * a; 

Czy wyrażenie 5 * zostanie zoptymalizowane do zaledwie 5? Jeśli nie, to czy jest zdefiniowana jako:

const int a = 1; 

Odpowiedz

13

To będzie wstępnie obliczyć żadnych przejawów stale podczas kompilacji, w tym ciąg konkatenacji. Bez niego zostanie on pozostawiony samemu sobie.

Twój pierwszy przykład kompiluje do tej IL:

.maxstack 2 
.locals init ([0] int32, [1] int32) 

ldc.i4.1 //load 1 
stloc.0 //store in 1st local variable 
ldc.i4.5 //load 5 
ldloc.0 //load 1st variable 
mul  // 1 * 5 
stloc.1 // store in 2nd local variable 

Drugi przykład kompiluje do tego:

.maxstack 1 
.locals init ([0] int32) 

ldc.i4.5 //load 5 
stloc.0 //store in local variable 
+0

Nawet bez const, kompetentny kompilator będzie wiedział, że "a" nie zmienia się między przypisaniem a użyciem. –

+0

Właściwy kompilator może to przyjąć, ale nie może wiedzieć, czy z jakiegoś powodu naciśnięcie klawisza int na stos uniemożliwi mu załadowanie go do zmiennej lokalnej. –

+0

Czy to z optymalizacją czy bez niej? –

1

Stała propagacji jest jednym z najczęstszych i najprostszych optymalizacji.

0

To, co optymalizowałby kompilator, nie jest mnożeniem przez 1 per se, ale raczej arytmetyczne z wartościami znanymi podczas kompilacji. Więc tak, kompilator zoptymalizuje wszystkie matematyki w twoim przykładzie, z lub bez const.

Edytuj: Kompilator kompetentny , powiem.

+0

I skompilowałem i zdemontowałem go i nie zoptymalizował on nie wyrażenia const. –

+0

Czy jest możliwe, że JIT zoptymalizuje go w czasie wykonywania? –

+0

@Neil Williams: Miałabyś taką nadzieję, ale JIT naprawdę nie jest miejscem, w którym można odkryć rzeczy, które mogłeś wymyślić podczas kompilacji. –

1

Patrząc na kod wygenerowany przez kompilator mono, wersja z niestanowiącą a wykonuje mnożenie w czasie wykonywania. Oznacza to, że mnożenie nie jest zoptymalizowane. Jeśli utworzysz const, multiplikacja zostanie zoptymalizowana.

Kompilator Microsoft może mieć bardziej agresywny kompilator, najlepszym rozwiązaniem jest spojrzenie na kod wygenerowany przez kompilator, aby zobaczyć, co robi.