如何解决如何测量链表 java 中的搜索时间
我需要测量不同值的 LinkedLists 的搜索时间。我的解决方案不合逻辑,所以我不知道我是否走在正确的道路上。 这是我的解决方案;
LinkedList<Integer> myList = new LinkedList<>();
for (int i = 1; i <= 1000; i++)
myList.add(i);
Collections.shuffle(myList);
Random rand = new Random();
myList.contains(rand.nextInt(myList.size()));
System.out.println(System.nanoTime());
LinkedList<Integer> myList2 = new LinkedList<>();
for (int i = 1; i <= 2000; i++)
myList2.add(i);
Collections.shuffle(myList2);
myList.contains(rand.nextInt(myList2.size()));
System.out.println(System.nanoTime());
这些是我的输出
38565758048600
38565759163200
解决方法
您无法像这样衡量绩效。计算机不可靠;不是今天,也不是几十年。操作系统先发制人。 JVM JIT。 CPU 有内核。核心具有管道和分层缓存。你绝对不走运;单个 contains
之间的纳米时间绝对不是一回事 - 这就像试图通过检查阿姆斯特丹码头拍打的海洋高度来测量檀香山有人在水中撒尿的效果。还涉及大约 10 亿个规模更大的其他因素。
衡量绩效的正常原则是记时间,做事,然后再记时间。时差?那是花了多长时间。但是您必须不止一次地运行该操作;但是很多次(然后取平均值),并且在运行几次以确保缓存行和 JIT 进程稳定之前,实际上不要认真对待时间。您还需要确保 VM 热点引擎不会优化您的整个代码,因此您还必须实际使用结果(您正在丢弃 boolean
} 返回;这可能会导致热点引擎意识到它可以消除整个调用,因为它不可能更改列表。
总之,这对于任何 Java 新手来说都是完全不可能的;即使是一个头发花白的老将也极有可能做错,因为这与时间有关,因此很难“测试”您的时间框架是否真的有效。
幸运的是,您不必编写它。 It already exists: JMH。你要么使用它,要么使用它的直接竞争对手,或者你几乎可以肯定地从你的时间代码中得到完全的谎言和捏造。
请注意,contains
的参与对于计时来说是一个非常糟糕的主意;您希望您计时的代码尽可能可靠。因此,不要打乱列表,也不要要求随机数。每次都要求一个特定的数字,或一组数字,或复制列表,将其打乱,然后搜索每个数字 - 这意味着输入列表中的所有数字都只搜索一次,但顺序是任意的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。