Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi - Důvěryhodnost GetTickCount

Dobrý den,
snažím se optimalizovat program psaný v jazyce Pascal. Jedná se o konzolovou aplikaci. Na počátku zjistím čas systému pomocí GetTickCount a na konci provedu odečet od konečného času získaného opět GetTickCount. Je tato metoda zjišťování délky trvání algoritmů důvěryhoná, je systémový čas lineární?

Důvod otázky:

Program využívá funkce Random(), ale ne funkci Randomize, takže měření by mělo probíhat se stejnou tabulkou náhodných čísel. Používal jsem 4 lokální proměnné Boolean. Po nějaké době jsem je přestal používat v programu, ale nechal jsem je nadeklarované. Prováděl jsem měření pomocí výše uvedené metody.

Měření s nevyužívanými proměnnými: 4875, 4859 (Tyto dvě hodnoty se střídají)
Měření bez nevyužitých proměnných: 4968, 5000, 5109, 4969, 4984, atd. (Téměř každé měření jinou hodnotu)

Děkuji

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Máš to nějaké pomalé...:-D Java 1.6.0, stará E6300. public class Test { public static void main(Str…
MaSo 26.10.2012 17:55
MaSo
Furt to mas pomale. public class Test { public static void main(String[] args) { long timeBefore =…
MM.. 26.10.2012 18:12
MM..
0 ms mas proto, ze ty tam pro zmenu nemas ten cyklus ;-) nový
Jan Fiala 26.10.2012 19:51
Jan Fiala
No jasně tak tomuhle kodu neverim ani kozu. Například Oracle level optimalizeru +2 by te s tim neka… nový
AZOR 26.10.2012 18:19
AZOR
Vsak jasně, kdybych tam dal VM argument -server (možná by stačila i tiered compilation), pravděpodob… nový
MaSo 26.10.2012 18:28
MaSo
Inac nie som si isty ci do long v jave ulozis 10^9 (neviem zhlavy nechce sa mi to hladat), takze si… nový
MM.. 26.10.2012 18:38
MM..
Uložíš, nerobil...:-) nový
MaSo 26.10.2012 18:40
MaSo
Máš to nějaké pomalé... Java 1.6.0, stará E6300. Pomale to ma proto, ze decrementuje primo ten exte… nový
Jan Fiala 26.10.2012 19:49
Jan Fiala
A kdyz I nadeklaruju jako LongInt misto Int64 (protoze to uz je hodne velky kalibr), tak jsem s case… nový
Jan Fiala 26.10.2012 19:58
Jan Fiala
Jaký máš HW? V Javě vlastně stačí normal int. Teď jsem na 850ms, níž už to na mojem HW asi nesrazím… nový
MaSo 26.10.2012 20:01
MaSo
Hardware? Lenovo ThinkPad T61 ;-) Stejné výsledky jsem na tom notebooku dostal i ve VirtualBoxu. Po… nový
Jan Fiala 27.10.2012 11:13
Jan Fiala
358 na i5-2410M poslední
Wikan 27.10.2012 12:14
Wikan

Máš to nějaké pomalé...:-D Java 1.6.0, stará E6300.

public class Test {

    public static void main(String[] args) {
            long timeBefore = System.nanoTime();
            double i = Math.pow(10, 9);
            long retyped = (long) i;

            while (retyped > 0) {
                retyped = retyped - 1;
            }

            long timeAfter = System.nanoTime();
            long time = (timeAfter - timeBefore) / 1000000;
            System.out.println(time + " ms");
        }
}
2536 ms
2534 ms
2532 ms
2543 ms
2537 ms
2535 ms....atd.

Furt to mas pomale.

public class Test {

    public static void main(String[] args) {
            long timeBefore = System.nanoTime();

            double i = Math.pow(10, 9);
            long retyped = 0;

            long timeAfter = System.nanoTime();
            long time = (timeAfter - timeBefore) / 1000000;
            System.out.println(time + " ms");
        }
}

0 ms :)

Zaujimave je to len s realnym kodom ktory fakt nieco zlozite rata.

No jasně tak tomuhle kodu neverim ani kozu.

Například Oracle level optimalizeru +2 by te s tim nekam poslal - while by nespoustel, protoze proc by to kurva taky delal, kdyz to pak nikde nepouzivas, tim chci rict ze zatimco vy si tu hrajete buhvinaco, tak kompilator s tim dela buhvico. Ja napriklad vim, ze v Oracle se ti na to while za urcitych okolosti vysere :-D a to pak to tu muzete asi tezko srovávat.

Máš to nějaké pomalé... Java 1.6.0, stará E6300.

Pomale to ma proto, ze decrementuje primo ten extended. Pokud to, stejne jako ty, pretypuje na LongInt (v Delphi na Int64), pak to trva stejne jako u tebe ;-)

var
  prvniCas, druhyCas: Cardinal;
  i: Int64;
begin
  prvniCas := GetTickCount;
  i := Trunc(Power(10, 9));
  repeat
      Dec(i);
  until i=0;
  druhyCas := GetTickCount;
  writeln(inttostr(druhyCas-prvniCas));
  Readln;
end.

Zkousel jsem, jestli se nejak projevi Do While a Repeat - Until a ne :-)

Zpět do poradny Odpovědět na původní otázku Nahoru