- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
某些函数使用分支预测系统,可以更快地计算某些数据结构,例如在包含 if 语句函数的循环中使用排序数据比处理速度更快,而数据未排序(有关分支预测的更多信息,请参阅以下精彩文章: Why is it faster to process a sorted array than an unsorted array? )。
我的问题相当简单:C、Python、MATLAB、R 等高级编程语言是否使用马尔可夫链预测来提高某些计算的速度?
我不是专家,我刚刚开始学习马尔可夫链,但在我看来,每个代码(主要是包含循环的代码)都具有某种可用于加速计算的时间可预测随机事件。
示例是应用于包含 1 到 200 之间整数的矩阵的函数,其中 90% 的值低于 100,即 2 位数字。似乎根据 x 或 y 位整数的概率自动“预分配”一定数量的位可以提高性能。
这就是分支预测的工作原理吗?这是否扩展到任何计算?
最佳答案
理论上,如果计算整数乘法实际上是位大小的递增函数,那么这是正确的。也就是说,如果整数乘法被实现为带有 if 语句的循环。然而,在当前一代 64 位 CPU 上,32 位整数的计算与 16 位整数或 64 位整数的计算成本“相同”,因为它们将使用在硬件中实现的相同加法器门。更复杂的讨论可以在 Performance 32 bit vs. 64 bit arithmetic 找到。
相反,如果您手动执行此操作,则尝试实际存储这些部分大小的值(例如位字段、位向量)会产生额外开销成本。
假设现在我们正在讨论非常大的整数,想想java.math.BigInteger
。那么您正确地说,您可以通过预先分配所述位数而不是从 1 个单位(“数字”)开始并在执行操作时创建新的“数字”来获得性能优势。看看 OpenJDK Implementation of BigInteger.multiply()
。这正是他们在 multiply
方法中所做的事情。这个想法在某些方面也与Pre-allocation performance tip for MATLAB相关。 。当您可以轻松地预分配数组时,不要在 OutOfBounds
上进行不必要的分支。
现在直接回答你的问题,即语言是否利用马尔可夫链,我相信不会。我见过的任何语言源(或引擎,就此而言)都没有维护真正的马尔可夫链。大多数高级语言在其上下文中都是通用的,因此状态预测会给任何类型的计算增加相当大的开销。回到 java.math.BigInteger 示例,仅分配数字总和几乎总是比使用存储状态的预测机制更快。它可能会节省结果中的内存,但会降低性能。 CPU 本身依赖于状态机(可以被认为是马尔可夫链)来执行预测优化,但这是因为它可以负担得起,而不会造成明显的成本损失(请参阅 wiki on branch prediction 或 java hardware array prefetching 中的示例)。
话虽这么说,时间可预测事件的想法是提高总体性能的关键,值得加以利用;它不仅限于分支预测。数据的组织对于性能至关重要。示例包括Generational Garbage Collection in .NET , Efficient Management of Particles in Particle FX和Web Server Predictive Prefetching 。最后一个实际上利用马尔可夫预测器来确定将哪个页面预取到缓存中作为用户日志的函数。在智能数据组织的游戏引擎和运行时实现中可以找到许多其他示例,以便击败分支预测或完全跳过它!
在实际开发中,大多数优化依赖于对数据进行简化假设,而不是应用马尔可夫预测器。因此,如果您希望利用分支预测,请了解您的数据并妥善组织它。这要么会改善你的预测,要么让你完全跳过它。使用预测器可能会花费更多的开发和执行时间。如果您仍然认为预测器可能有帮助,请维护一个简单的状态机并将其与简单的解决方案进行基准测试。
关于python - "Branch Predictions"和高级语言中的马尔可夫链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29203568/
我试图让 Branch.io 在 Android 上工作,但我遇到了: myapplication.MainActivity cannot be cast to android.app.Applica
当我执行 git branch 时,我知道我在分支 v0.2 上。 git branch v0.1 * v0.2 但是当我执行 git push 时它说“你当前分支的上游分支与你当前分支的名称不
在使用 Git GUI 检查远程分支 releases/rel_5.4.1 之后,当我尝试 push 时看到了这个意外的错误消息: fatal: The upstream branch of your
SO 上有一个相关问题处理如何更改 push 命令的参数以避免出现此消息: fatal: The upstream branch of your current branch does not mat
arc feature [branch-name] 和 git branch [branch-name] 有什么区别? 他们似乎都创建了一个新分支。 最佳答案 arc feature [branch-
FIFO、LIFO 和LC Branch and Bound 有什么区别? 最佳答案 Branch & Bound 通过使用估计边界来限制可能解决方案的数量来发现完整搜索空间内的分支。不同的类型(FI
有人知道这两个切换和跟踪远程分支的命令之间的区别吗? git checkout -b branch origin/branch git checkout --track origin/branch 我
关于 git-svn 工作流程有很多问题,但我一直无法弄清楚这一点: This section of the svn book谈到 SVN 的一个常见做法:创建一个分支,并在主干更新时不断合并主干中的
我正在构建一个控制 git 存储库的 PHP 应用程序。我有一个执行命令 git status 的同步函数,虽然没有返回“你的分支是最新的”,但可能会提前采取必要的行动,比如远程或本地分支。 我还构建
是否可以使用 branch.io 创建自定义链接,例如 https://example.app.link/fzmLEhobLD所以我可以用我的自定义 10 位参数(如 amitpp8888)控制 fz
我从 github 克隆了一个分支,它的名字是 dev。我已经开始使用它, pull 和推送代码更改并确保我的本地存储库与远程存储库保持同步。我要开始实现一个新功能,因此创建了一个新分支,如下所示:
我们有一个发布模型,为简单起见,我们假设每月 1 次。所以,我们通常会去: Jan -> trunk trunk -> Feb trunk trunk et
使用 Branch.io HTTP API 创建的链接不会在 Branch 门户中显示为快速链接。快速链接很方便,因为它们在一个 View 中显示“点击”、“打开”等内容 用于创建链接的 API:li
我创建了一个分支,当我第一次从源代码合并到分支时,出现了一大堆旧的变更集,它说没有合并,但它们在分支之前就存在,我确认它们在那里。 例子: 假设当 Source 中有 9 个变更集时,我从 Sourc
这是关于我为什么这样做 不是 收到错误“致命:当前分支 A 没有上游分支”。 我删除了 远程 分公司 一个 使用命令 git push origin :A . 然后我切换到本地 分支 A 使用命令 g
我正在使用 clover 插件来检查我的 java 代码测试覆盖率。 我为所有行编写了单元测试。当我点击红线时,它显示“true分支执行了2次,分支执行了0次”。这是什么意思?我该如何解决这个问题?
很确定我误解了 git。 我的目标 我在 github 上有一个带有“master”分支的私有(private)存储库。 我还想有一个生产分支,我会将所有更改从 master 推送到该分支。 然后我想
我将一个相当老的主题分支重新定位到 master 上。由于在 rebase 期间有很多冲突,我想将旧主题分支与 rebased 分支进行比较,以确保我没有意外删除或搞砸主题上的任何更改。我最接近的是比
我正在尝试将我的一个项目推送到 github,但我一直收到此错误: peeplesoft@jane3:~/846156 (master) $ git push fatal: The current b
Jenkins Git 插件根据我的引用规范在控制台输出中生成了以下命令 下面两个命令有什么区别?他们的输出看起来没什么不同。我在下面给出了他们的输出: 命令 1: git fetch --no-ta
我是一名优秀的程序员,十分优秀!