我正在使用 MapReduce 框架在 Google App Engine 上做一些工作(在本例中为 MD5 暴力破解)。
我遇到了一个问题,即代码在 GAE 中运行非常缓慢,即使只是使用开发服务器也是如此
此代码https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/mapreduce/HashMapper.java每秒只能处理大约 4,000 个哈希(这是单个调用map(),里面根本没有使用google app engine api)。
我将代码带到外面并独立运行 - https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/StandaloneTest.java,该版本将超过 100 万每秒。运行速度较慢的是中央循环,这很奇怪,因为这些代码都与谷歌应用引擎无关。
我已经尝试在 Google App 引擎代码上运行分析器,但我没有发现任何有用的东西 - 似乎是对 checkRestricted() 的大量调用以及类似的事情。我尝试删除安全管理器
即使是这个简单的代码:
int i;
for (i=0; i< 1000000; i++) {
i += 2;
i += (int) Math.sin(i * (i + (int) System.currentTimeMillis()));
}
long enda = System.currentTimeMillis();
System.out.println("took " + (enda - starta) + " i:" + i);
如果我把它放在一个普通程序中,运行时间为 117 毫秒,而在开发人员模式下的 servlet 中,在同一处理器上运行时间超过 400 毫秒。
(有趣的是,映射器每秒在生产的 Google App Engine 上完成大约 60,000 个哈希。所以速度要快得多,但与独立程序相比仍然非常慢)