ตอนแรกฉันมีรหัสนี้:
import java.util.*;
public class sandbox {
public static void main(String[] args) {
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < 100_000; i++) {
hashSet.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 100_000; i++) {
for (Integer val : hashSet) {
if (val != -1) break;
}
hashSet.remove(i);
}
System.out.println("time: " + (System.currentTimeMillis() - start));
}
}
ใช้เวลาประมาณ 4s ในการเปิดใช้งานซ้อนกันสำหรับลูปบนคอมพิวเตอร์ของฉันและฉันไม่เข้าใจว่าทำไมจึงใช้เวลานาน วนรอบด้านนอกรัน 100,000 ครั้งส่วนในของลูปควรรัน 1 ครั้ง (เนื่องจากค่าใด ๆ ของ hashSet จะไม่เป็น -1) และการลบรายการออกจาก HashSet คือ O (1) ดังนั้นควรมีการดำเนินงานประมาณ 200,000 ครั้ง หากโดยทั่วไปมีการดำเนินงาน 100,000,000 ครั้งในหนึ่งวินาทีรหัสของฉันจะใช้เวลา 4s เพื่อให้ทำงานได้อย่างไร
นอกจากนี้หากบรรทัดhashSet.remove(i);
ถูกใส่ความคิดเห็นรหัสจะใช้เวลาเพียง 16ms หากความเห็นด้านในสำหรับลูปถูกใส่ความคิดเห็น (แต่ไม่ใช่hashSet.remove(i);
) รหัสจะใช้เวลาเพียง 8ms
for val
ลูปคือสิ่งที่สละเวลา remove
ยังคงเป็นไปอย่างรวดเร็วมาก ค่าโสหุ้ยบางอย่างตั้งค่าตัววนซ้ำใหม่หลังจากที่ชุดถูกแก้ไข ... ?
for val
ลูปจึงช้า อย่างไรก็ตามโปรดทราบว่าไม่จำเป็นต้องวนซ้ำเลย หากคุณต้องการที่จะตรวจสอบว่ามีค่าใด ๆ ที่แตกต่างจาก -1 hashSet.size() > 1 || !hashSet.contains(-1)
ในชุดก็จะมีประสิทธิภาพมากขึ้นในการตรวจสอบ