程序的时间执行——JavaScript

程序的时间执行——JavaScript,javascript,time,Javascript,Time,我想测量调用另外两个函数的licz()函数的执行时间。我是否正在使用window.performance.now();以正确的方式?因为无论我将数组的大小设置为100、1000或10000,时间都显示为0或1毫秒。这是有问题的。有人知道吗?我想根据执行时间和数组大小制作一个图表,但首先我需要弄清楚它为什么不能正确工作。不要注意波兰人的名字。。。我在乎这次 //generator tablicy var size = 10000; // rozmiar tablicy var ma

我想测量调用另外两个函数的licz()函数的执行时间。我是否正在使用window.performance.now();以正确的方式?因为无论我将数组的大小设置为100、1000或10000,时间都显示为0或1毫秒。这是有问题的。有人知道吗?我想根据执行时间和数组大小制作一个图表,但首先我需要弄清楚它为什么不能正确工作。不要注意波兰人的名字。。。我在乎这次

//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`);
//生成器
变量大小=10000;//罗兹米亚尔酒店
var max=100;//马克西马尔纳·莫利瓦·利茨巴·多维洛索瓦尼亚
var选项卡=[];
对于(k=0;k制表符[mid])
{
返回pierwszy(制表符,(中间+1),p,w,n);
}
其他的
{
返回pierwszy(标签,l,(中间1),w,n);
}
}
返回-1;
}
函数ostatni(tab,l,p,w,n)//indeks ostatniego wystąpienia
{

如果(l我认为这一次不是代码问题,而是代码问题

这可能足够快,执行时总是小于1ms,如果精度大于1ms,则总是会得到0ms或1ms

这意味着,除非你把迭代次数增加很多,否则你就看不到它所需要的实时时间。这可能是因为不同的原因,但我无法真正理解你的代码,我觉得这是一个二进制搜索。这意味着,除非你去一些数量级的元素,否则你不会看到更多的元素e时间上的差异


二进制搜索是
log2(n)
所以仅仅加上一个零(意味着n现在是10*n)并不能消除它。

很确定这只是意味着你的代码运行非常快。或者你的浏览器设置为“抵制指纹”除其他外,这会降低
性能的精度。现在
最接近100ms。使用:
console.time(“我的第一次测试”);/*您在这里的测试*/console.timeEnd(“我的第一次测试”)
好的,为了看到不同,我应该主要增加数组的大小或可以绘制并放入数组的最大值?只是数组的大小,但在确认算法的运行时间之前,如果它真的是
log2(n)
那么增加数组大小是有意义的,因为它是
n=tab.length()
。在代码中,要更改的是
大小
变量。是的,时间复杂度是logn。第二个和第三个函数是logn,第一个函数只有O(1),所以通常有O(logn).只有在将大小增加10000个元素后,我才发现ms中存在一些差异,所以我猜这是一个非常快的算法。是的,这将符合10'000'00~10*2^20的想法,这将使它至少多执行20个步骤,所以不会太多,但在您的基准测试中应该是可见的。