簡體   English   中英

程序的時間執行 - JavaScript

[英]Time execution of program - JavaScript

我想測量調用另外兩個函數的 licz() function 的時間執行。 我使用的是 window.performance.now(); 以正確的方式? 因為無論我將數組的大小設置為 100、1000 還是 10000,時間都顯示為 0 或 1 ms。 它有問題。 有人有什么想法嗎? 我想根據時間執行和數組的大小制作一個圖表,但首先我需要弄清楚為什么它對我不起作用。 不要在意波蘭人的名字……我在乎這一次。

//generator tablicy
    var size = 10000; // rozmiar tablicy
    var max = 100; // maksymalna możliwa liczba do wylosowania
    var tab = [];
    
    for(k=0; k<size; k++)
    {
        input = Math.floor(Math.random() * max) + 1;
        tab[k] = input;
    }
    tab.sort(function(a, b) {return a - b;}); // uporządkowanie tablicy
    //------------------------------------------------
    
    
    function licz(tab, w, n)
    {
        //indeks pierwszego wystąpienia "w"
        idMin = pierwszy(tab, 0, n-1, w, n);
        
        //jeśli "w" nie istnieje w tablicy
        if (idMin == -1){return idMin};
        
        //indeks ostatniego wystąpienia
        idMax = ostatni(tab, idMin, n-1, w, n);
        ile = idMax-idMin+1;
        //zwracamy ilość powtórzeń wartości "w"
        return ile;
    }
    
    function pierwszy(tab, l, p, w, n) //indeks pierwszego wystąpienia
    {
        if(l <= p) //l - początek zakresu listy p - koniec zakresu listy
        {
            mid = Math.floor((l+p)/2); //środkowy indeks, zaokrąglamy w dół gdy l;p to lista z parzystą liczbą elementów
            
            if((mid == 0 || w  > tab[mid-1])&&(tab[mid] == w)) //mid == 0 gdy tablica ma 1 element
            {
                return mid; // zwraca indeks pierwszego wystapienia
            }
            else if(w > tab[mid])
            {
                return pierwszy(tab, (mid+1), p, w, n);
            }
            else
            {
                return pierwszy(tab, l, (mid-1), w, n);
            }
        }
        return -1;
    }
    
    function ostatni(tab, l, p, w, n)//indeks ostatniego wystąpienia
    {
        if(l <= p)
        {
            mid2 = Math.floor((l+p)/2);
                
            if((mid2 == n-1 || w < tab[mid2+1]) && (tab[mid2] == w))
            {
                return mid2; //zwraca indeks ostatniego wystąpienia
            }
            else if(w < tab[mid2])
            {
                return ostatni(tab, l, (mid2-1), w, n);
            }
            else
            {
                return ostatni(tab, (mid2+1), p, w, n);
            }
        }   
    }
    
    //Wywołanie funkcji
    w = 49; // szukana wartość
    n = tab.length; // długość tablicy
    
    var start = window.performance.now();
    ilosc = licz(tab, w, n); // zwraca liczbe powtórzeń szukanej wartośći w tablicy
    var end = window.performance.now();
    
    if(ilosc == -1)
    {
        document.write("Wartość "+w+" pojawiła się 0 razy<br/>");
    }
    else
    {
        document.write("Wartość "+w+" pojawiła się "+ilosc+" raz/razy<br/>");
    }

    console.table(tab); // wypisanie tablicy
    console.log(`Time execution: ${end - start} ms`);

我認為這次不是代碼問題,而是用戶保護問題。

這可能足夠快以執行您始終小於 1 毫秒,如果精度高於此,那么您將始終獲得 0 毫秒或 1 毫秒。

這意味着,除非您將迭代次數提高到更多,否則您將看不到它所花費的實際時間。 可能是出於不同的原因,但我無法真正弄清楚您的代碼,而且我的印象是它是二進制搜索。 這意味着在您使用 go 之前,您不會看到更多元素數量級的差異。

二進制搜索是log2(n) ,所以只添加一個零(意味着 n 現在是 10 * n)不會減少它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM