Avatar billede gulbaek Nybegynder
04. november 2003 - 11:58 Der er 3 kommentarer og
1 løsning

Bitwise shift operators versus alm. Gange & Dividere

Yes har lige et spørgsmål, kan det betale sig at benytte Bitwise shift operators i forhold til alm gange og dividere

x = x >> y
x = x << y

x = x * y
x = x / y


Ved godt at shift operators er meget hurtigere, men er .net opbygget så smart at alm gange og dividere blir lavet om til shift operators ved compiling ?
Avatar billede arne_v Ekspert
04. november 2003 - 12:07 #1
Shift i.s.f. gange og divider var noget man gjorde i 16, 20 og 25 MHz
dagene.

Jeg er overbevist om at * er lige så hurtig som << på moderne CPU'er.

>> er muligvis stadig hurtigere end / (ikke så meget på x86 men meget på
forskellige RISC).

Compileren kan principielt godt optimere hvis den kan gennemskue at det
er en konstant.

Og selvom den måske ikke gør det nu, så gør den det måske i næste version.

Medmindre du koder ekstremte tidskritiske applikationer (kryptografisk
analyser eller lignende), så fokuser på at skrive letlæselig kode og
glem alt om den slags optimeringer.
Avatar billede arne_v Ekspert
04. november 2003 - 21:25 #2
Kode:

using System;

class MainClass
{
    private const int N = 1000000000;
    public static void Main(string[] args)
    {
        int tmp;
        tmp = 0;
        long t1 = DateTime.Now.Ticks;
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < 10; j++)
            {
                tmp = tmp << 1;
            }
        }
        long t2 = DateTime.Now.Ticks;
        Console.WriteLine("<<1 : " + (t2 - t1));
        tmp = 0;
        long t3 = DateTime.Now.Ticks;
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < 10; j++)
            {
                tmp = tmp * 2;
            }
        }
        long t4 = DateTime.Now.Ticks;
        Console.WriteLine("*2  : " + (t4 - t3));
        tmp = 0;
        long t5 = DateTime.Now.Ticks;
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < 10; j++)
            {
                tmp = tmp >> 1;
            }
        }
        long t6 = DateTime.Now.Ticks;
        Console.WriteLine(">>1 : " + (t6 - t5));
        tmp = 0;
        long t7 = DateTime.Now.Ticks;
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < 10; j++)
            {
                tmp = tmp / 2;
            }
        }
        long t8 = DateTime.Now.Ticks;
        Console.WriteLine("/2  : " + (t8 - t7));
    }
}

Output:

<<1 : 18281250
*2  : 12031250
>>1 : 12031250
/2  : 208437500
Avatar billede arne_v Ekspert
04. november 2003 - 21:27 #3
Det kan slet ikke betale sig at << i.s.f. *.

>> er hurtigere end /, men 10 milliarder divsioner på 20 sekunder
er ike et problem for de fleste apps.
Avatar billede gulbaek Nybegynder
04. november 2003 - 21:50 #4
jeg takker mange gange for den fine forklaring samt test
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester