maa*_*nus 5 java performance unsigned
我已经见过该JITC使用用于检查数组边界(所述测试符号比较0 <= x < LIMIT相当于0 ? LIMIT其中?把数字视为无符号数量).所以我很好奇它是否适用于任意形式的比较0 <= x < LIMIT.
for (int i=0; i<LENGTH; ++i) {
int x = data[i];
if (condition) result += x;
}
Run Code Online (Sandbox Code Playgroud)
条件不同
0 <= x 叫 abovex < LIMIT 叫 below0 <= x && x < LIMIT 叫 inRange0 <= x & x < LIMIT 叫 inRange2并准备数据,使条件成立的概率相同.
结果应该非常相似,above因为它与零相比可能略快一些.即使JITC无法使用无符号比较进行测试,结果above也below应该相似.
谁能解释一下这里发生了什么?我做错了很可能......
我在Ubuntu 2.6.32-54-generic上使用Java build 1.7.0_51-b13和i5-2400 CPU @ 3.10GHz,如果有人关心的话.由于结果inRange及其inRange2附近0.00特别令人困惑,我在该领域采取了更多步骤重新运行基准测试.
基准测试结果可能存在的差异与不同级别的 CPU 缓存有关。
由于使用了原始 int(s),因此不会发生 JVM 特定的缓存,就像自动装箱 Integer 到原始值时会发生的情况一样。
因此,考虑到 data[] 数组的最小内存消耗,剩下的就是低级别值/操作的 CPU 缓存。由于如上所述,值的分布基于随机值,并且在测试中条件成立的统计“概率”为真,因此可能的原因是,根据值,每个测试都会进行或多或少的(随机)缓存,导致更多的随机性。
此外,根据计算机的隔离(后台服务/进程),测试用例可能不会完全隔离地运行。确保这些测试中除核心操作系统功能和 JVM 之外的所有内容均已关闭。将 JVM 内存最小/最大设置为相同,关闭所有网络进程、更新等。