我在java中构建测试工具,并尝试比较两个解析器的性能和延迟。分析来自实时单一馈送的数据。我无法控制Feed,也没有#34;模拟Feed"为了模拟数据,所以为了比较苹果和苹果,我想尽可能同时运行我的解析。我是java和线程的新手,所以我不确定这是不是最好的方法。我的想法是旋转2个线程:
SomeFeed feed = new SomeFeed();
Thread thread1 = new Thread () {
public void run () {
parser1.parseFeed(feed);
}
};
Thread thread2 = new Thread () {
public void run () {
parse2.parseFeed(feed);
}
};
thread1.start();
thread2.start();
线程以这种方式运行会大致同步运行吗?或者有更好的方法吗?
由于
答案 0 :(得分:1)
让两个线程完全并行运行并不是你真正可以控制的东西。但如果您同时关心开始(几乎),您可以使用CyclicBarrier
(取自here):
// We want to start just 2 threads at the same time, but let's control that
// timing from the main thread. That's why we have 3 "parties" instead of 2.
final CyclicBarrier gate = new CyclicBarrier(3);
Thread t1 = new Thread(){
public void run(){
gate.await();
//do stuff
}};
Thread t2 = new Thread(){
public void run(){
gate.await();
//do stuff
}};
t1.start();
t2.start();
// At this point, t1 and t2 are blocking on the gate.
// Since we gave "3" as the argument, gate is not opened yet.
// Now if we block on the gate from the main thread, it will open
// and all threads will start to do stuff!
gate.await();
System.out.println("all threads started");
这将使您最接近同时启动它们。
答案 1 :(得分:1)
这是一种做事方式。其他方法是实现Runnable接口
public class SomeFeed implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new SomeFeed())).start();
}
}
新方法是使用ThreadPool。
这是您创建池并执行代码的方式
ExecutorService pool = Executors.newFixedThreadPool(2);
for(int i = 0; i < 2; i++){
pool.submit(new SomeFeed());
}
确保SomeFeed实现可调用接口。
可以找到更多信息here
答案 2 :(得分:0)
无论您遇到单个Feed问题,同时运行解析器都是比较它们的最差方式。
将Feed放在一边,成为两个测试的参考数据集。
你需要至少测量它们所花费的时间,而CPU却没有干扰地使用它。
并且您还应该执行超过1500次运行以更好地计算例程所需的平均时间(1500个方法调用是加速代码的热点JIT编译的阈值)。此外,尝试至少使代码运行超过30秒,以便平均潜在的操作系统和磁盘变化干扰。
如果您注意到GC暂停(在基准测试期间始终启用gc日志),那么您必须在更多内存中运行测试以避免完整gc(例如使用-Xmx2G),或者经常运行测试两个解析器中完整GC的数量相当相等。
无论如何,内存滥用,因此GC时间也是判断最差解析器的性能因素。