我正在做一个科学公平项目,测试五种不同的平方根算法来计算两个平方根。 (见我的问题here)。
我有两个选择。
System.nanoTime()
第二个问题的缺点是,在每次迭代中检查它是否精确到五十个小数位的过程需要一些时间,因此结果将不准确。如果还有其他方法,请通知我
第一个问题的缺点是我不知道如何在一段时间内运行程序。
我应该采取哪种行动?
答案 0 :(得分:0)
我不知道如何在一段时间内运行程序。
一种选择是运行需要在线程中运行x时间的代码 在时间到时终止线程,然后让线程代码显示其结果 像这样的东西。
import java.io.*;
public class SqrtThread extends Thread{
private vars.....
public SqrtThread (double input) {
super('sqrtThread');
this.input = input;
....
this.start();
}
public void run() {
while !(Thread.interrupted) {
//Do numberChruching
}
//output result
}
}
然后使用伪代码启动线程,如:
SqrtThread sqrtThread = new SqrtThread(2); //Will start automatically
start high resolution timer
while (time has not elapsed) {
sleep for very short period;
}
sqrtThread.interrupt(); //stop the thread.
你实际上如何进行非常短暂的睡眠是作业的一部分,所以我会留下让你找出来。
答案 1 :(得分:0)
测试所消耗的时间对于每种方法都是相同的。因此,如果您对比较感兴趣,这不是一个缺点。此外,我怀疑测试所消耗的时间并不重要。
另外:无论如何你需要这样的测试。通常,一个人对给定错误的结果感兴趣。由于所需的时间取决于很多其他东西(CPU,JVM等),因此在已知时间内获得的未知精度不是很高。由此投票支持第二种方法。
答案 2 :(得分:0)
如果你花了一定的时间,然后打断这个过程,你就会有一个有趣的问题要回答:
我会让你思考这个问题,而我建议你如何打断一个仍在计算的答案。
首先,您应该提前知道平方根的前五十位,因为您需要“知道”答案是否正确。正确性应该与它需要多长时间无关,所以也许你只需要验证计算一次,然后硬编码正确的答案。
其次,您需要将平方根计算算法打包到可以运行的内容中。我建议使用Java接口Runnable
,它强制使用签名
public void run() {
// your code goes here
}
然后你会得到一些能与Java Thread
完美融合的东西,你可以打断Java线程。一旦中断了线程的结果,你就不能相信线程内的任何计算(在正常情况下)。
最简单的方法(因为你的项目不是利用最新的Java技术,而是试图反驳你的反假设)是做类似的事情
Thread solution1 = new Thread(new Runnable1());
solution1.start();
如果你发现事情花了太长时间,以后
Thread.sleep(10000); // sleeps the current thread 10 seconds
solution1.interrupt();
请注意,这是停止线程的一种非常不优雅的方式,您不能相信Runnable1
之后正在处理的任何内容。
其他更复杂的技术可用,例如:
public class Runnable1 implements Runnable {
private boolean running;
public Runnable1() {
running = false;
}
public void run() {
running = true;
while (running) {
// do one step of your computation
}
}
public void shutdown() {
running = false;
}
}
上面的例子有很多功能,确实可以提高Java代码的质量;但是,请注意代码质量与证明您的观点无关。抛出代码非常好,忘记实际解决问题。
然后将上面的代码称为
Runnable1 runnable1 = new Runnable1();
Thread thread1 = new Thread(runnable1);
thread1.start
// some means of waiting
Thread.sleep(10000); // sleeps 10 seconds
runnable1.shutdown();
这种技术在已知状态下(在下一次循环迭代之前)关闭你的runnable,所以你可能会从技术中捕获一些中间数据,前提是Runnable
的其余部分有办法报告中间解决方案。