不确定这个问题是应该在这里还是在serverfault中,但它与java有关,所以这里是:
我有两台服务器,技术非常相似:
两者都运行Solaris x86,配置完全相同。
都启用了turbo-boost,没有超线程。
因此,server2应该比server1快一点。我在两个平台上运行以下简短的测试程序。
import java.io.*;
public class TestProgram {
public static void main(String[] args) {
new TestProgram ();
}
public TestProgram () {
try {
PrintWriter writer = new PrintWriter(new FileOutputStream("perfs.txt", true), true);
for (int i = 0; i < 10000; i++) {
long t1 = System.nanoTime();
System.out.println("0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop");
long t2 = System.nanoTime();
writer.println((t2-t1));
//try {
// Thread.sleep(1);
//}
//catch(Exception e) {
// System.out.println("thread sleep exception");
//}
}
}
catch(Exception e) {
e.printStackTrace(System.out);
}
}
}
我打开perfs.txt并对结果取平均值,我得到:
这是一个有点预期的结果(server2 perfs&gt; server1 perfs)。
现在,我取消注释“Thread.sleep(1)”部分并再次测试,结果现在是:
这次server2 perfs&lt; server1 perfs
这对我没有任何意义......
显然我正在寻找一种在第二种情况下改进server2 perfs的方法。必须有某种不同的配置,我不知道哪一种。 操作系统完全相同,java版本相同。
它可以与核心数量相关联吗? 也许这是BIOS设置?虽然BIOS不同(AMI与戴尔),但设置看起来非常相似。
我会尽快更新戴尔的BIOS并重新测试,但我很感激任何见解......
感谢
答案 0 :(得分:0)
我会尝试不同的测试程序,尝试运行这样的事情。
public class Timer implements Runnable
{
public void startTimer()
{
time = 0;
running = true;
thread = new Thread(this);
thread.start();
}
public int stopTimer()
{
running = false;
return time;
}
public void run()
{
try
{
while(running)
{
Thread.sleep(1);
time++;
}
}catch(Exception e){e.printStackTrace();}
}
private int time;
private Thread thread;
private boolean running;
}
现在计时器主要是主要的:
public class Main
{
public static void main(String args[])
{
Timer timer = new Timer();
timer.startTimer();
for(int x=0;x<1000;x++)
System.out.println("Testing!!");
System.out.println("\n\nTime Taken: "+timer.stopTimer());
}
}
我认为这是测试系统运行速度更快的好方法。试试这个,让我知道它是怎么回事。
答案 1 :(得分:0)
好吧,我有一个理论:Thread.sleep()阻止热点编译器进入。因为你有一个睡眠,它假设循环不是“热”,即它没关系太多循环中的代码效率如何(因为,毕竟,你睡觉的唯一目的可能是减慢速度)。
因此,你在循环中添加一个Thread.sleep(),循环中的其他东西也会运行得更慢。
我想知道如果你在循环中有一个循环并测量内循环的性能,它是否会有所作为? (并且在外部循环中只有Thread.sleep())。在这种情况下,编译器可能会优化内部循环(如果有足够的迭代)。
(提出一个问题:如果此代码是从生产代码中提取的测试用例,为什么生产代码会睡眠?)
答案 2 :(得分:0)
我实际上更新了DELL R610上的BIOS并确保调整所有BIOS CPU参数以获得最佳的低延迟性能(无超线程等)。 它解决了它。表演与&amp;没有Thread.sleep有意义,R610在两种情况下的整体性能都比太阳好得多。 原来的BIOS似乎没有正确或完全使用nehalem功能(而太阳确实如此)。
答案 3 :(得分:-1)
您正在测试控制台更新的速度。这完全取决于操作系统和窗口。如果在IDE中运行它,它将比在xterm中运行慢得多。即使使用哪种字体以及窗口有多大,也会使性能大不相同。如果在运行测试时窗口关闭,这将提高性能。
以下是我将如何运行相同的测试。该测试是自包含的,并进行您需要的分析。
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
public class TestProgram {
public static void main(String... args) throws IOException {
File file = new File("out.txt");
file.deleteOnExit();
PrintWriter out = new PrintWriter(new FileWriter(file), true);
int runs = 100000;
long[] times = new long[runs];
for (int i = -10000; i < runs; i++) {
long t1 = System.nanoTime();
out.println("0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop");
long t2 = System.nanoTime();
if (i >= 0)
times[i] = t2 - t1;
}
out.close();
Arrays.sort(times);
System.out.printf("Median time was %,d ns, the 90%%tile was %,d ns%n", times[times.length / 2], times[times.length * 9 / 10]);
}
}
在2.6 GHz Xeon WIndows Vista盒上打印
Median time was 3,213 ns, the 90%tile was 3,981 ns