返回信息流题目:两个agent:ping和pong,互相通信。ping先发送初始值0。之后,两者每次收到一个数字,就将它加1发给对方。当ping接收到的值超过某个限制时结束。
Java代码:
package junk.pingpong;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PingPongTestLockCond {
static class Context {
Lock lock = new ReentrantLock();
long msg;
boolean pingSent;
Condition pingSentCond = lock.newCondition();
boolean pongSent;
Condition pongSentCond = lock.newCondition();
}
static class Ping implements Runnable {
public Context ctx;
public long curVal = 1;
public long limit;
public Ping(Context ctx, long limit) {
this.ctx = ctx;
this.limit = limit;
}
@Override
public void run() {
try {
ctx.lock.lock();
while (true) {
// send
ctx.msg = curVal;
ctx.pingSent = true;
ctx.pingSentCond.signalAll();
// receive
while (!ctx.pongSent) {
ctx.pongSentCond.await(); // implicit unlock
}
ctx.pongSent = false;
long newVal = ctx.msg;
// update
curVal = newVal + 1;
// exit
if (newVal >= limit) { // last message and exit
ctx.msg = -1L;
ctx.pingSent = true;
ctx.pingSentCond.signalAll();
break; // exit
}
}
} catch (InterruptedException e) {
System.out.println("[ping] Interrupted. This should not happen.");
e.printStackTrace(System.out);
} finally {
ctx.lock.unlock();
}
}
}
static class Pong implements Runnable {
public Context ctx;
public long curVal;
public Pong(Context ctx) {
this.ctx = ctx;
}
@Override
public void run() {
try {
ctx.lock.lock();
while (true) {
// receive
while (!ctx.pingSent) {
ctx.pingSentCond.await(); // implicit unlock
}
ctx.pingSent = false;
long newVal = ctx.msg;
// update
curVal = newVal + 1;
// exit
if (newVal == -1) { // exit on demand
break; // exit
}
// send
ctx.msg = curVal;
ctx.pongSent = true;
ctx.pongSentCond.signalAll();
}
} catch (InterruptedException e) {
System.out.println("[pong] Interrupted. This should not happen.");
e.printStackTrace(System.out);
} finally {
ctx.lock.unlock();
}
}
}
public static void main(String[] args) throws Exception {
Context ctx = new Context();
Ping ping = new Ping(ctx, 5000000L);
Pong pong = new Pong(ctx);
Thread pingThr = new Thread(ping);
Thread pongThr = new Thread(pong);
long t1 = System.currentTimeMillis();
pingThr.start();
pongThr.start();
pingThr.join();
pongThr.join();
long t2 = System.currentTimeMillis();
System.out.printf("time: %dms\n", t2-t1);
System.out.printf("ping.curVal = %d\n", ping.curVal);
}
}
运行结果:
time: 37344ms
ping.curVal = 5000001
Python代码:
import datetime
sz = 5000000
def pong():
v = yield
while v >= 0:
v2 = v + 1
v = yield v2
return
def ping(peer):
cur_val = 0
while cur_val <= sz:
new_val = peer.send(cur_val)
cur_val = new_val + 1
print(cur_val)
n2 = pong()
n2.send(None) # start it so it pauses on the first yield
t1 = datetime.datetime.now()
ping(n2)
t2 = datetime.datetime.now()
d = t2-t1
print(d)
运行结果:
5000001
0:00:01.584955
这是一条镜像帖。来源:北邮人论坛 / java / #44877同步于 2015/10/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[黑Java系列]别告诉我Java比Python还慢
nuanyangyang
2015/10/23镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
嗯
【 在 nuanyangyang (暖羊羊) 的大作中提到: 】
: 题目:两个agent:ping和pong,互相通信。ping先发送初始值0。之后,两者每次收到一个数字,就将它加1发给对方。当ping接收到的值超过某个限制时结束。
: Java代码:
: [code=java]
: ...................
通过『我邮2.0』发布
time: 20901ms
ping.curVal = 5000001
5000002
0:00:10.328000
为什么我的跑的时间和你的差别这么大?
这是说python快么?
【 在 timruning 的大作中提到: 】
: time: 20901ms
: ping.curVal = 5000001
: 5000002
: ...................
你用的是什么机器呢?操作系统呢?还有jvm的版本
【 在 timruning 的大作中提到: 】
: time: 20901ms
: ping.curVal = 5000001
: 5000002
: ...................
原帖是在2GHz的ivy bridge处理器,osx, oracle JDK 1.8, python3.5上跑的。
在另一个机器上,配置:
CPU: Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz (Sandy Bridge, 4核)
Python: 3.5.0
Java: openjdk 1.8.0_65
试了试,结果如下:
java:
time: 16261ms
ping.curVal = 5000001
python:
5000002
0:00:00.749442
【 在 nuanyangyang 的大作中提到: 】
:
: 原帖是在2GHz的ivy bridge处理器,osx, oracle JDK 1.8, python3.5上跑的。
: 在另一个机器上,配置:
: ...................
这样啊,我的jvm版本应该是新的,刚装的。我的意思他们时间相差2倍。。