Tag: 性能

Java Hotspot服务器中的多态性成本很高

当我在Java Hotspot客户端中运行我的计时测试程序时,我得到了一致的行为。 但是,当我在Hotspot服务器中运行它时,我得到了意想不到的结果。 从本质上讲,在我试图复制的某些情况下,多态性的成本是高得令人无法接受的。 这是Hotspot服务器的已知问题/错误,还是我做错了什么? 测试程序和时间如下: Intel i7, Windows 8 Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode) Mine2: 0.387028831 <— polymorphic call with expected timing Trivial: 1.545411765 <— some more polymorphic calls Mine: 0.727726371 <— polymorphic call with unexpected timing. Should be about 0.38 Mine: 0.383132698 <— direct call with expected timing 随着我添加额外的测试,情况变得更糟。 […]

multithreading循环的效率

问候贵族社区, 我想要以下循环: for(i = 0; i < MAX; i++) A[i] = B[i] + C[i]; 这将在使用线程的共享内存四核计算机上并行运行。 下面的两个替代方案正在考虑由这些线程执行的代码,其中tid是线程的id:0,1,2或3。 (为简单起见,假设MAX是4的倍数) 选项1: for(i = tid; i < MAX; i += 4) A[i] = B[i] + C[i]; 选项2: for(i = tid*(MAX/4); i < (tid+1)*(MAX/4); i++) A[i] = B[i] + C[i]; 我的问题是,是否有一个比另一个更有效,为什么?

Java Math.pow(x,2.0)与Math.pow(x,2.0000001)的性能

我试图比较pow(x,2.0)和pow(x,2.0000001) ,虽然2.0会更快,但它们的速度相同。 我甚至通过使用-Xint参数运行jar来删除JIT优化。 知道为什么会这样吗,拜托? 非常感谢!

加快java深层复制操作

我们使用序列化实现了通用深度复制机制。 import java.io.*; public class CopyUtil { public static Object clone(Object source) { Object retVal = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(source); oos.flush(); oos.close(); ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); retVal = in.readObject(); } catch (IOException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } return […]

如何用Java检测Internet连接速度?

在我的Java应用程序中,如何检测Internet连接速度有多快? 例如,我在家里使用AT&T Fast DSL,我想知道是否有办法可以编写一个执行以下操作的方法: int getInternetConnectionSpeed() { … } 这将返回一个以kbps为单位的数字,例如2800kbps [2.8 M] 编辑:我问的原因是,在我的应用程序中,我可以打开多个Internet流,具体取决于用户的Internet连接速度,我希望它自动确定打开多少流而不会阻塞应用程序。

Javaexception处理的良好实践

我有一些关于在Java中处理exception的问题。 我读了一下它并得到了一些矛盾的指导方针。 exception处理的最佳实践 我们来看看上面提到的文章: 它声明, 如果“客户端代码无法执行任何操作”,通常应避免使用已检查的exception。 但它究竟意味着什么? 在GUI中显示错误消息是否足以引发检查exception的原因? 但它会迫使GUI程序员记住捕获RuntimeExceptions及其后代以显示潜在的错误信息。 本文中提出的第二种观点是,除非我想在其中实现一些海关领域/方法,否则应该避免发明自己的exception类。 我通常不同意这一点,我今天的练习恰恰相反:我在我自己的exception结构中包含exception,以反映我编写的类实现的目标,即使它们只是在不添加任何新方法的情况下扩展Exception。 我认为在抛出更高层时更灵活地处理它们对于使用这些类的程序员来说通常更清晰易懂。 我今天实现了一些代码,这篇文章在抛出RuntimeException的文章中提出了“新方法”,然后让Sonar分析它。 为了让我更加困惑,Sonar将我的RuntimeExceptions标记为主要错误,并标记为“避免在自己的类型中抛出root类型exception,wrap’em”。 所以它看起来很有争议,你怎么看? 我还从今天的技术主管之一那里得知,只是包装exception是不好的,因为这对JVM来说是一个非常昂贵的操作。 对我来说,另一方面,在任何地方抛出SQLExceptions或IOExceptions看起来像是一些打破封装。 那么你对我在这里提出的问题的一般态度是什么? 何时在我自己的类型中包装exception,何时不应该这样做? 那个‘客户端无法做到这一点的地方,抛出运行时exception? “ 性能问题怎么样?

处理大量元素时,Hibernate内存不足exception

我正在尝试处理重量级元素(图像)的集合。 收集的大小在8000-50000条目之间变化。 但由于某些原因,在处理1800-1900条目之后,我的程序属于java.lang.OutOfMemoryError:Java堆空间。 在我理解每次调用session.getTransaction()时,commit()程序应该释放堆内存,但看起来它永远不会发生。 我做错了什么? 这是代码: private static void loadImages( LoadStrategy loadStrategy ) throws IOException { log.info( “Loading images for: ” + loadStrategy.getPageType() ); Session session = sessionFactory.openSession(); session.setFlushMode( FlushMode.COMMIT ); Query query = session.createQuery( “from PageRaw where pageType = :pageType and pageStatus = :pageStatus and sessionId = 1” ); query.setString( “pageStatus”, PageStatus.SUCCESS.name() ); query.setString( […]

数组数组与多维数组的性能比较

当我在大学里使用C ++时,我被告知尽可能使用多维数组(特此是MDA),因为它在一个大块中分配后表现出更好的内存局部性。 另一方面,arraysarrays(AoA)被分配在多个较小的块中,可能散布在物理存储器中的任何位置,无论何处发现空位。 所以我想第一个问题是:这是一个神话,还是值得关注的建议? 假设它是后者,那么接下来的问题就是如Java这样没有真正MDA的语言。 当然,用1DA模拟MDA并不难。 从本质上讲,具有MDA的语言的语法糖可以实现为对没有MDA的语言的库支持。 这值得努力吗? 对于像Java这样的语言来说,这是一个太低的优化问题吗? 我们应该放弃数组并使用List甚至原语吗? 另一个问题:在Java中,一次分配AoA( new int[M][N] )可能会产生不同于分层次的内存分配( new int[M][]; for (… new int[N] )?

java线程缓存刷新什么时候发生?

线程1:正在执行此循环 while(running) { // Do Task() } println(“Done”); 线程2设置为false如果运行是一个volatile变量,则thread1退出循环并打印“Done”。 我的问题是,如果运行不是易失性,Thread1何时从主内存中读取运行变量? 注意:我知道在关于同步和volatile变量的关系之前发生了,但是即使运行不是volatile或synchronized,线程1也会停止。 所以我的问题是线程1何时决定从主存储器中读取,因为没有同步或没有挥发性

同时,其他环

当然这在java(迄今为止)中是一个不可能的陈述,但理想情况下我想实现它,因为它是许多迭代的核心。 例如,第一次多次调用它在创建ArrayList时我正在做650,000次。 不幸的是,现实是我的实际代码没有在else循环中set ; 因此它会传递add和set命令并浪费时间。 之后我还在另一个循环中,它只执行集合,因为数据已经创建,并且这是多嵌套的,因此它是一个漫长的过程。 ArrayList dataColLinker = new java.util.ArrayList(); … … public void setLinkerAt( int value, int rowIndex) { … while(rowIndex >= dataColLinker.size()) { dataColLinker.add(value); } else { dataColLinker.set(rowIndex, value); } 任何想法或理论? 在if语句和ArrayList命令等方面,我不确定java的速度