- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我当时正在研究一些并行化,这让我开始研究阿姆达尔定律。我已经阅读了很多关于该主题的帖子;
Calculate performance gains using Amdahl's Law
How to calculate Amadahl's Law for threading effectiveness
http://en.wikipedia.org/wiki/Amdahl%27s_law
...但希望能找到一个 C# 示例在实践中展示它。查找无果。从理论上讲,应该可以制作一个串行应用程序,为可并行化的部分计时,运行一个并行化的版本,记录并行部分的长度,并将差异(知道正在使用多少处理器)与 Amdahl 函数的结果进行比较。这是正确的吗?有人知道这样的例子吗?
最佳答案
注意:可以在 My Github Page 上找到该程序的完整工作可下载版本。
因此,根据阿姆达尔定律,我们将工作分为“必须串行运行的工作”和“可以并行化的工作”,所以让我们将这两个工作负载表示为 List<Action>
:
var serialWorkLoad = new List<Action> { DoHeavyWork, DoHeavyWork };
var parallelizableWorkLoad = new List<Action> { DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork };
哪里DoHeavyWork
delegate 被巧妙地抽象为:
static void DoHeavyWork()
{
Thread.Sleep(500);
}
如您所见,为了好玩,我已经使可并行化的工作负载变得更重一些,并作为它的一个不错的例子。
接下来我们必须以串行方式运行两个工作负载以获得我们的基线:
var stopwatch = new Stopwatch();
stopwatch.Start();
// Run Serial-only batch of work
foreach (var serialWork in serialWorkLoad)
{
serialWork();
}
var s1 = stopwatch.ElapsedMilliseconds;
// Run parallelizable batch of work in serial to get our baseline
foreach (var notParallelWork in parallelizableWorkLoad)
{
notParallelWork();
}
stopwatch.Stop();
var s2 = stopwatch.ElapsedMilliseconds - s1;
至此,我们知道了每个工作负载串行运行所花费的时间。现在,让我们再次运行它,将可并行部分并行化。
stopwatch.Reset();
stopwatch.Start();
// Run Serial-only batch of work
foreach (var serialWork in serialWorkLoad)
{
serialWork();
}
var p1 = stopwatch.ElapsedMilliseconds;
// Run parallelizable batch of work in with as many degrees of parallelism as we can
Parallel.ForEach(parallelizableWorkLoad, (workToDo) => workToDo()); // In Java this is Magic Unicorns
stopwatch.Stop();
var p2 = stopwatch.ElapsedMilliseconds - p1;
现在我们有了基线和并行化版本,我们可以计算加速比并报告我们的发现:
var speedup = (double)(s1 + s2) / (p1 + p2);
Console.WriteLine("Serial took : {2}ms, {0}ms for serial work and {1}ms for parallelizable work", s1, s2, s1 + s2);
Console.WriteLine("Parallel took: {2}ms, {0}ms for serial work and {1}ms for parallelizable work", p1, p2, p1 + p2);
Console.WriteLine("Speedup was {0:F}x", speedup);
正如 Amdahl 定律告诉您的那样,由于仅串行工作,很难与您拥有的内核数量完美扩展。
关于c# - C# 中的阿姆达尔定律示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14326211/
一年多以来,我一直在阅读C++并用它编写小程序。最近我遇到了三巨头法则。我从来不知道这条法律。 无意中,我在这里找到了它:Rule of Three . 我可以知道 C++ 中的任何其他此类定律吗?
根据 Control.Arrow 文档,对于许多 monads(那些 >>= 操作是严格的)instance MonadFix m => ArrowLoop (Kleisli m)不满足 loop (
通常在 Haskell 中我们定义 Monad s 表示为 return和>>= 。有时分解也方便>>=进入fmap和join 。 Monad一旦您习惯了这两种公式的定律,它们是众所周知的并且相当直观
我正在阅读 James Iry's blog post在 Scala 中的 Monads 上。我在第三部分,我对他关于单元的单子(monad)第二定律的描述感到困惑。特别是这种说法: unit(x)
我见过提到 IO不满足单子(monad)定律,但我没有找到一个简单的例子来说明这一点。有人知道一个例子吗?谢谢。 编辑:如ertes和 n.m.指出,使用 seq有点非法,因为它可以使任何 monad
齐普夫定律是许多现实生活中的一种模式,齐普夫定律最常见的情况是在文本段落中,其中最常用的单词的数量是第二个最常用单词的两倍。 我一直在学习 Python 中的字典,并尝试自己做这件事,但对它们的一些方
这可能是一个幼稚的问题,但是 RSpec 的测试 DSL 是否违反了 Demeter 法则? 这是来自 http://rspec.info 的 RSpec DSL 示例: bowling.score.
Snell's law指出入射角和折射角的正弦比等于给定 Material 折射率比的倒数: 我想实现一个简单的程序来可视化法律。自 , 和 是已知的,这是我计算的方式 : theta2 = asin
嘿,我正在开发一个文本生成器,它应该可以生成数百万种不同的文本。为了使每篇文章的内容更真实,我使用了 Zipf 定律它运行良好,单词分布正确。 但是下面的 next() 函数执行得非常慢,因为我想生成
我正在使用一个工具来自动生成按层次结构组织的 XML 文件的类表示形式。 XML 文件是我的应用程序需要能够访问的设置文件(只读)。 如果我将顶级节点(例如,AppSettings)传递给需要访问一项
不使用形式推导,如何测试自定义的Monad实例是否遵循Monad定律? 最佳答案 FWIW,这是我最近编写的一组 QuickCheck 属性,用于测试从 F 代数派生的 Maybe 实现的 Monad
我是一名优秀的程序员,十分优秀!