3

我正在用 Java 编写程序

在这个程序中,我正在读取和更改一组数据。这是代码示例:

public double computation() {
    char c = 0;
    char target = 'a';
    int x = 0, y = 1;

    for (int i = 0; i < data.length; i++) {
        // Read Data
        c = data[index[i]];

        if (c == target)
            x++;
        else
            y++;

        //Change Value
        if (Character.isUpperCase(c))
            Character.toLowerCase(c);
        else
            Character.toUpperCase(c);

        //Write Data
        data[index[i]] = c;
    }
    return (double) x / (double) y;
}

顺便说一句,INDEX 数组以随机顺序包含 DATA 数组的索引,以防止预取。我通过在 INDEX 数组中使用随机索引来强制错过所有缓存访问。

现在我想通过收集有关其命中率的信息来检查 CPU 缓存的行为。

有没有为此目的开发的工具?如果没有,有什么技术吗?

4

2 回答 2

1

我认为您无法从 Java 获得如此低级的信息,但有人可能知道得更好。您可以编写没有缓存未命中的相同程序并检查差异。例如,这就是我在另一篇文章中提出的建议。

于 2012-10-08T20:12:38.750 回答
1

在 Linux 上,可以通过OProfile收集此类信息。每个 CPU 都有性能事件计数器。有关 AMD K15 系列活动的列表,请参见此处:http: //oprofile.sourceforge.net/docs/amd-family15h-events.php

OProfile 定期对事件计数器和程序计数器进行采样。程序运行后,您可以分析发生了多少事件以及在(统计上)什么程序位置。

OProfile 已内置 Java 支持。它与 Java JIT 交互并创建一个合成符号表来查找 Java 方法名称,以便生成 JIT 代码。

初始设置并不容易。如果有兴趣,我可以指导你或写更多关于它的内容。

于 2014-11-18T08:29:49.760 回答