Java 如何避免同步和对象创建?
我使用JOGL用Java编写了一个OpenGL应用程序。我试图完全避免在主应用程序阶段创建对象,因为它可能导致GC造成的小周期性延迟Java 如何避免同步和对象创建?,java,performance,concurrency,logic,Java,Performance,Concurrency,Logic,我使用JOGL用Java编写了一个OpenGL应用程序。我试图完全避免在主应用程序阶段创建对象,因为它可能导致GC造成的小周期性延迟 我想用我自己的方法总结一下JOGL的方法。设想一个方法void方法(int[]result,int offset),它接收指向数组和偏移量的指针,并在指定索引处将一个整数值放入其中。我想用simpleint getResult()来包装它 所以我需要在某个地方创建一个临时数组,我必须提前这样做(根据1) 但是,如果它将存储在包含此包装器方法的类的字段中,这将迫使我
void方法(int[]result,int offset)
,它接收指向数组和偏移量的指针,并在指定索引处将一个整数值放入其中。我想用simpleint getResult()来包装它
同步。我知道在大多数情况下,单线程访问时的同步不会产生很大的开销,但我仍然想知道是否有更好的解决方案
- 同步不是答案,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这可能是最好的解决方案,但它会稍微改变架构。你知道性能会产生怎样的影响吗?每次通话都需要这样做,对吗?我已经测试过了,性能非常好!我检查了他们是如何实现的,似乎他们正在将数据存储在线程本身中,并在数组中使用固定的简单偏移量。这就是我想要的!非常感谢你的回答,我在谷歌上搜索这个类-从未听说过,但它看起来非常有用和有前途。只是要注意你创建的线程数量,因为这些数据在线程结束之前不会被垃圾收集。你知道性能会有何影响吗?每次通话都需要这样做,对吗?我已经测试过了,性能非常好!我检查了他们是如何实现的,似乎他们正在将数据存储在线程本身中,并在数组中使用固定的简单偏移量。这就是我想要的!非常感谢你的回答,我在谷歌上搜索这个类-从来没有听说过,但它看起来非常有用和有前途。只是要注意你创建的线程数量,因为在线程结束之前,这些数据不会被垃圾收集。