- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
背景信息
我最近为我的类(class)交了一份关于算法和数据结构的作业。任务是实现一个解决方案来找到 maximum-subarray随机生成的数组。我们被要求同时实现蛮力算法和递归分而治之算法。
然后我们被要求分析运行时间,以查看在何种问题规模下蛮力算法会比递归解决方案更快。这是通过测量两种算法的运行时间(使用 System.nanoTime() 测量)来增加问题规模来完成的。
然而,确定这一点比我预期的要复杂一些。
好奇心
如果我开始运行问题大小为 5000 的两种算法超过 10 次,则递归算法的运行时间从一次运行到下一次下降大约 10 倍(从 ~1800µS执行,到 ~200µS 执行)并且它在其余迭代中保持更快。示例见下图
第二列和第三列只是为了验证两种算法都返回了正确的最大子数组
这是在装有 Java 1.6.0_29 的 OS X 10.7.3 上测试的 - 在运行 Windows 7 和 Java 1.6(确切版本号未知)的 PC 上执行时结果相同。
程序的源代码可以在这里找到:https://gist.github.com/2274983
我的问题是:是什么导致算法在“预热”后突然表现得那么好?
最佳答案
评论者已经指出 JIT 可能会导致此行为,但 OP 似乎不知道那是什么。所以只是简单地解释一下:
Java 虚拟机可以通过两种方式运行程序:
解释 Java 字节码。基本上,解释器一个一个地“遍历”字节码,检查每个字节码是什么,然后执行相应的操作。
将字节码转换为机器码,底层CPU可以直接运行。这称为“即时编译”或 JIT。
经过 JIT 转换为机器代码的程序运行速度要快得多,但编译需要时间,这可能会使程序启动速度变慢。因此,您的 JVM 做出了妥协:最初它只是解释字节码,但如果多次执行某个方法,它会 JIT 编译 只编译那个单独的方法。一般只有一小部分程序代码会被多次执行(内循环等),所以这种策略是有效的。
这样做的结果是,当您对 Java 代码进行性能测试时,您必须首先“预热”JVM,方法是在循环中运行您的代码足够多次,以便对性能关键的方法全部进行 JIT 编译。
在这种情况下,您的递归解决方案似乎比暴力解决方案从 JIT 编译中获益更多。这可能表明 JIT 编译器正在寻找一些极大有利于递归解决方案的优化——也许将那些递归调用转换为迭代代码?
关于java - 算法的性能突然提高了约 10 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9964361/
无论我在做什么,我都会得到这个输出,但模拟器不会启动,新创建的模拟器也不会启动。我在 Windows 下: 警告:./android/base/files/IniFile.cpp:155:无法处理 .
我用 package.json NPM 脚本中像这样的变量: // package.json { "version": "0.12.1", "scripts": { "get-vers
几天前,Facebook 与我们网站的连接突然停止工作,代码没有任何更改??? Facebook 做了一些改变??? http://www.presbium.sk/vstup-pre-uchadzac
我习惯于 grunt build 任务成功完成,但由于我将我的项目编辑与其他开发人员同事合并,它突然失败并出现我以前从未见过的错误: grunt build Loading "imagemin.js"
我不明白这个。突然之间,我无法使用 iOS 9.0 中引入的 UIUserNotificationActionResponseTypedTextKey 标识符来访问通知中的文本输入消息。 Xcode
在我调用某个 Google 的 Youtube 库后,我的应用程序在其回调之一后突然变得完全没有响应。 无响应意味着无法点击所有 UI 组件。 在 iOS 中是否有这样的东西可以禁用整个屏幕完全不响应
bool queueIsFull(int rearPointer) { if(rearPointer==9) return 1; else return
我正在使用 PHP、Apache 和 MySQL 开发 Web 应用程序。在过去的一年中,此应用程序的响应时间一直不错。昨天,应用程序在 Firefox 上突然变得非常慢(完整的页面加载,包括 CSS
几个小时后,从控制台发出的 PHP 命令不再接受本地路径。例如在 laravel 中我总是给出命令 php artisan 但从今晚开始我收到了以下回复 Status: 404 Not Found C
我有一个 session WCF 服务,它生成一个进程并在调用 IsInitiating 操作时打开一个到该进程的命名管道。当调用 IsTerminating 操作时,服务会沿着管道发送一条消息,通知
类似的问题已经回答了好几次,我确实检查了其中的许多问题。这是不同的,请继续阅读。 我在 strings.xml 中定义了大量(大量)字符串,并带有多个格式参数。例如: %s and also %s 这
我有一个简单的消息机器人,它是根据 Messenger 平台指南设置的。在过去的几个月里,它一直运行良好,每天发送大约六条消息。我根本没有碰它,但是突然,发送消息,即调用 https://graph.
我正在使用 Unity 开发一款简单的 3D 手机游戏。我的目标是在没有垂直同步的情况下达到 30 FPS。我的游戏在所有 iOS 设备上运行良好,没有发热和节流,但有奇怪的 FPS 下降。 FPS
我们有一个自定义小部件,多年来一直运行良好,直到上周。 看来 Json 回调现在仅适用于播放列表,不适用于轨道。 播放列表 /**/jQuery31108094578850496614_1482167
-bash:/Users/winchenzo/git-completion.bash: 没有那个文件或目录 -bash:/Users/winchenzo/git-prompt.sh: 没有那个文件或目
编辑:重启解决了问题。我仍然想知道最初是什么原因造成的,因为这种情况以前发生过一次,但我不记得当时我做了什么来修复它(当时重新启动并没有解决问题)。 我 cd 到包含我要编辑的文件的文件夹,然后从命令
我刚刚注册是因为我突然遇到了一个问题,目前为止运行良好的代码我之前在这里找到了一些非常好的答案。希望你们能再次帮助我,这次甚至是投票;) $sql='SELECT projektKurz, proje
我制作了一个小程序,它在 tcp 套接字上监听和发送线路,并将接收到的信息附加到 JTextArea。我用它在 Minecraft 服务器上聊天,而无需打开游戏。 我昨晚工作得很好,但当我起床时却不工
感谢您在这里查看我的问题。 我正在使用 Glide 从 Firebase 存储中获取图像,基本上我是在使用 url 从存储中获取图像。第一天它工作正常但突然停止获取图像。我没有碰代码。我检查了很多答案
FCM 通知已到达所有 iOS 设备。但通知在大约 1 年前注册的某些设备上不起作用。 FCM token 和 APNs token 似乎没有变化。为什么没有到达通知? FCM token 是否必须过
我是一名优秀的程序员,十分优秀!