相关疑难解决方法(0)

如何在Java中编写正确的微基准测试?

你如何在Java中编写(并运行)正确的微基准测试?

我在这里寻找代码示例和注释,说明要考虑的各种事项.

示例:基准测量应该测量时间/迭代或迭代/时间,为什么?

相关:秒表基准可以接受吗?

java benchmarking jvm jvm-hotspot microbenchmark

835
推荐指数
11
解决办法
11万
查看次数

将方法声明为静态有什么好处

我最近在Eclipse中查看了我的警告并遇到了这个问题:

静态警告

如果方法可以声明为static,它将给出编译器警告.

[edit] Eclipse帮助中的确切引用,对私有和最终的压力:

启用后,编译器将对privatefinal方法发出错误或警告,并且仅引用静态成员.

是的我知道我可以关掉它,但我想知道打开它的原因?

为什么将每个方法声明为静态是一件好事?

这会带来任何性能优势吗?(在移动领域)

指出一个方法为静态,我想是显示你不使用任何实例变量因此可以移动到utils样式类?

在一天结束时,我应该关闭它"忽略"或者我应该修复它给我的100多个警告吗?

你认为这只是污染代码的额外关键字,因为编译器无论如何只会内联这些方法吗?(有点像你没有声明每个变量你可以最终但你可以).

java optimization static coding-style

94
推荐指数
3
解决办法
2万
查看次数

为什么传递两个字符串参数比一个列表参数更有效

下面的代码分别调用两个简单的函数100亿次.

public class PerfTest {
    private static long l = 0;

    public static void main(String[] args) {
        List<String> list = Arrays.asList("a", "b");
        long time1 = System.currentTimeMillis();
        for (long i = 0; i < 1E10; i++) {
            func1("a", "b");
        }
        long time2 = System.currentTimeMillis();
        for (long i = 0; i < 1E10; i++) {
            func2(list);
        }
        System.out.println((time2 - time1) + "/" + (System.currentTimeMillis() - time2));
    }

    private static void func1(String s1, String s2) { l++; }
    private static void func2(List<String> sl) …
Run Code Online (Sandbox Code Playgroud)

java performance

15
推荐指数
1
解决办法
612
查看次数

Java:序列化到字节缓冲区的最快方法

我需要在 Java 中使用必须尽可能快的序列化库。这个想法是创建各种方法来序列化指定的值及其关联的键,并将它们放在字节缓冲区中。由于需要序列化的对象可能很多,因此必须创建多个包装此缓冲区的对象。

注意事项:我知道 Unsafe 类可能不会在每个 JVM 中实现,但这不是问题。过早优化:这个库必须很快,而且这个序列化是它唯一要做的事情。序列化后的对象通常很小(小于 10k),但它们很多,最大可达 2Gb。底层缓冲区可以扩展/减少,但我将跳过实现细节,该方法类似于 ArrayList 实现中使用的方法。

澄清我的情况:我有各种方法,例如

public void putByte(short key, byte value);
public void putInt(short key, int value);
public void putFloat(short key, float value);

... and so on...
Run Code Online (Sandbox Code Playgroud)

这些方法将键和值附加到字节流中,因此如果我调用 putInt(-1, 1234567890) 我的缓冲区将如下所示:(流是大端)

     key       the integer value  
[0xFF, 0xFF, 0x49, 0x96, 0x02, 0xD2]
Run Code Online (Sandbox Code Playgroud)

最后, 必须调用像toBytes()这样的方法来返回一个字节数组,该数组是底层缓冲区的修剪(如果需要)版本。

现在,我的问题是:在 Java 中执行此操作的最快方法是什么?

我在谷歌上搜索并偶然发现了各种页面(其中一些在 SO 上),我也做了一些基准测试(但我在基准测试方面并没有真正的经验,这就是我向更有经验的程序员寻求帮助的原因之一话题)。

我想出了以下解决方案:

1-最直接的:字节数组

如果我必须序列化一个 int ,它看起来像这样:

public void putInt(short key, int value)
{
    array[index]   = (byte)(key >> 8);
    array[index+1] = (byte) …
Run Code Online (Sandbox Code Playgroud)

java memory arrays performance serialization

6
推荐指数
1
解决办法
3666
查看次数