簡體   English   中英

在Java中平均For循環迭代的時間

[英]Averaging the time of a For loop iteration in Java

我試圖獲得將每個元素添加到5000個元素的數組中所需的平均時間。 我可以獲取循環中每個加法運算的時間,但是在獲取運行總計時遇到了麻煩,因此我無法計算循環外的平均值。

到目前為止,我有以下代碼在其中打印總計

for (int i = 0; i < testData.length; i++) {
        testData[i] = UUID.randomUUID().toString();
    }

    /****************************
     * Linked List Set Unit Test
     ****************************/

    long linked_add_time = 0;
    long linked_add_total = 0;

    for (int i = 0; i < 5000; i++){ // first 5000 elements used to measure average add time
        linked_add_time = System.nanoTime();
        linked.add(testData[i]);
        linked_add_time = System.nanoTime() - linked_add_time;
        linked_add_total =+ linked_add_time;
    }
    System.out.println(linked_add_total);

    for (int i = 5000; i < testData.length; i++){
        linked.add(testData[i]);
    }

檢查每個循環沒有意義,因為這個時間太短了,它將接近於零。 其次,您無論如何都不會記住每個循環時間。 因此,請檢查循環前后的時間,而不是除以循環數。

long startTime = System.nanoTime();

for (int i = 0; i < 5000; i++){
    linked.add(testData[i]);
}
System.out.println("Average time: " +(startTime + System.nanoTime())/5000 );

如果您使用的是LinkedList ,那么無論集合多大,添加時間都應該相同。 如果您使用ArrayList而不是每個下一個添加操作,則可能會更慢( ArrayList應該重建內部數組,每添加n新元素)。

而不是測量單個加法,而是測量與“循環之前”和“循環之后”的差,然后除以循環大小即可得到該值:

final int count = 5000;
final long startTime = System.nanoTime();
for (int i = 0; i < count; ++i) {
    linked.add(testData[i]);
}
final long endTime = System.nanoTime();
final long totalTime = endTime-startTime;
System.out.printf("Total Time = %dns.  Avg Time: %dns\n", totalTime, totalTime/count);

如此簡單,獲取初始時間和結束時間,然后除以平均數即可得到的每5000分之一:

long startTime = System.nanoTime();
for (int i = 0; i < 5000; i++){ 
    linked.add(testData[i]);
}
long endTime = System.nanoTime();
System.out.println("Average time: " +(endTime - startTime)/5000 );

我什至沒有想到只讓總時間超出循環范圍。 我能夠做到這一點。 感謝您的輸入

long startTime = System.nanoTime();
    for (int i = 0; i < 5000; i++){ // first 5000 elements used to measure average add time
        linked.add(testData[i]);
    }
    System.out.println("Average time for adding to LinkedList: " +((System.nanoTime() - startTime)/5000));

更改此行:

linked_add_total =+ linked_add_time;

linked_add_total += linked_add_time;

暫無
暫無

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

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