Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免同步和对象创建?_Java_Performance_Concurrency_Logic - Fatal编程技术网

Java 如何避免同步和对象创建?

Java 如何避免同步和对象创建?,java,performance,concurrency,logic,Java,Performance,Concurrency,Logic,我使用JOGL用Java编写了一个OpenGL应用程序。我试图完全避免在主应用程序阶段创建对象,因为它可能导致GC造成的小周期性延迟 我想用我自己的方法总结一下JOGL的方法。设想一个方法void方法(int[]result,int offset),它接收指向数组和偏移量的指针,并在指定索引处将一个整数值放入其中。我想用simpleint getResult()来包装它 所以我需要在某个地方创建一个临时数组,我必须提前这样做(根据1) 但是,如果它将存储在包含此包装器方法的类的字段中,这将迫使我

我使用JOGL用Java编写了一个OpenGL应用程序。我试图完全避免在主应用程序阶段创建对象,因为它可能导致GC造成的小周期性延迟

  • 我想用我自己的方法总结一下JOGL的方法。设想一个方法
    void方法(int[]result,int offset)
    ,它接收指向数组和偏移量的指针,并在指定索引处将一个整数值放入其中。我想用simple
    int getResult()来包装它

  • 所以我需要在某个地方创建一个临时数组,我必须提前这样做(根据1)

  • 但是,如果它将存储在包含此包装器方法的类的字段中,这将迫使我使包装器方法
    同步。我知道在大多数情况下,单线程访问时的同步不会产生很大的开销,但我仍然想知道是否有更好的解决方案

  • 注:

    • 同步不是答案,3.000.000个同步块,只需monitorenter monitorexit需要17毫秒。如果要保持60 fps,您只有16个。(6)
    由于我没有足够的投票权,我发现欣赏戴夫答案的唯一方法就是写一个演示:

    类测试{
    专用静态最终整数周期=100000000;
    int[]全局=新的int[1];
    ThreadLocal local=新的ThreadLocal();
    void _fastButIncorrect(){global[0]=1;}
    同步的void _slowButCorrect(){global[0]=1;}
    空虚{
    int[]tmp=local.get();
    if(tmp==null){
    tmp=新整数[1];
    本地.set(tmp);
    }
    tmp[0]=1;
    }
    长快速但不正确(){
    长l=System.currentTimeMillis();
    对于(int i=0;i
    在我的机器上,结果是:

    fastButIncorrect cold: 40
    slowButCorrect   cold: 8871
    amazing          cold: 46
    fastButIncorrect  hot: 38
    slowButCorrect    hot: 9165
    amazing           hot: 41
    

    再次感谢你,戴夫

    如果没有太多线程,可以使用ThreadLocal:

    ThreadLocal<int[]> tmpArrayThreadLocal = new ThreadLocal<int[]>();
    

    您可以通过将ThreadLocal封装在另一个类中来清理代码。

    如果没有太多线程,可以使用ThreadLocal:

    ThreadLocal<int[]> tmpArrayThreadLocal = new ThreadLocal<int[]>();
    

    您可以通过将ThreadLocal封装到另一个类中来清理代码。

    1。“听起来这是一个严重的过早的担忧。”马特波尔的评论恰到好处。您有显示GC延迟的分析器输出吗?除非你有一个合适的对象带宽,否则这不应该是一个问题。请避免讨论问题的本质。没有同步和对象创建的解决方案吗?为什么不为每个线程创建一个包装器呢?这到底是个问题吗?渲染本身是多线程的吗?Jogl支持这一点吗?@StefanHaustein可能这是最好的解决方案,但它会稍微改变架构。1。“听起来这是一个严重的过早的担忧。”马特波尔的评论恰到好处。您有显示GC延迟的分析器输出吗?除非你有一个合适的对象带宽,否则这不应该是一个问题。请避免讨论问题的本质。没有同步和对象创建的解决方案吗?为什么不为每个线程创建一个包装器呢?这到底是个问题吗?渲染本身是多线程的吗?Jogl支持这一点吗?@StefanHaustein这可能是最好的解决方案,但它会稍微改变架构。你知道性能会产生怎样的影响吗?每次通话都需要这样做,对吗?我已经测试过了,性能非常好!我检查了他们是如何实现的,似乎他们正在将数据存储在线程本身中,并在数组中使用固定的简单偏移量。这就是我想要的!非常感谢你的回答,我在谷歌上搜索这个类-从未听说过,但它看起来非常有用和有前途。只是要注意你创建的线程数量,因为这些数据在线程结束之前不会被垃圾收集。你知道性能会有何影响吗?每次通话都需要这样做,对吗?我已经测试过了,性能非常好!我检查了他们是如何实现的,似乎他们正在将数据存储在线程本身中,并在数组中使用固定的简单偏移量。这就是我想要的!非常感谢你的回答,我在谷歌上搜索这个类-从来没有听说过,但它看起来非常有用和有前途。只是要注意你创建的线程数量,因为在线程结束之前,这些数据不会被垃圾收集。