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
Máš to nějaké pomalé... Java 1.6.0, stará E6300. Pomale to ma proto, ze decrementuje primo ten exte…
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…
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.

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