jjzjj

c# - 现在开始为任务并行库设计是否为时过早?

coder 2024-05-30 原文

自从 Microsoft 首次宣布 .NET 任务并行库 (TPL) 以来,我一直以极大的兴趣关注它的开发。

我坚信我们最终会利用 TPL。我想问的是,在 Visual Studio 2010 和 .NET 4.0 发布时开始利用 TPL 是否有意义,或者再等一段时间是否有意义。

为什么现在开始?

  • .NET 4.0 任务并行库似乎设计得很好,一些相对简单的测试表明它在当今的多核 CPU 上运行良好。
  • 自大约七年前购买我的第一台四处理器 Dell Poweredge 6400 以来,我一直对使用多个轻量级线程来加速我们的软件的潜在优势非常感兴趣。当时的实验表明这是不值得的,我主要将其归因于在每个 CPU 的缓存(当时没有共享缓存)和 RAM 之间移动数据的开销。
  • 竞争优势 - 我们的一些客户永远无法获得足够的性能,毫无疑问,我们今天可以使用 TPL 构建更快的产品。
  • 听起来很有趣。是的,我知道有些开发人员宁愿用锋利的棍子戳自己的眼睛,但我们真的很享受最大化性能。

为什么要等?

  • 随着多核支持的成熟,今天的英特尔 Nehalem CPU 是否代表了我们的发展方向?您现在可以购买具有 4 个内核的 Nehalem CPU,它们共享一个 3 级缓存,并且很可能在 Visual Studio 2010/.NET 4.0 发布时共享一个 3 级缓存的 6 核 CPU。显然,核心数量会随着时间的推移而增加,但架构呢?随着核心数量的增加,它们还会共享缓存吗? Nehalem 的一个问题是,尽管内核之间存在非常快速的互连,但它们具有非统一内存访问 (NUMA),这会导致性能降低和结果不可预测。 future 的多核架构是否能够取消 NUMA?
  • 同样,.NET Task Parallel Library 是否会随着成熟而发生变化,需要修改代码才能充分利用它?

限制

  • 我们的核心引擎是 100% C# 并且必须在没有完全信任的情况下运行,因此我们仅限于使用 .NET API。

最佳答案

我现在就开始。我强烈怀疑我们已经看到了大部分变化——即使在候选发布版中有一些调整,我相信它们会在 PFX team blog 中得到很好的记录。 , 并且易于更改。即使芯片发生变化,我希望 TPL 能够在未来的版本中进行适当的调整——我个人希望当前的 TPL 在处理这些新芯片方面仍然可能比任何手工制作的线程代码都做得更好,比如凡人我们可以写。

我看到的一个真正的缺点是现在还没有真正的学习资源。有一些文档、一些博客文章(其中一些现在已经过时)和一些示例代码——但没有专门介绍 PFX 的书籍。不过,我相信这些会及时到来 - 如果您处于游戏的早期阶段,您甚至可以写一个 :)

根据您的应用,您可能还想查看 Reactive Extensions ,它与 PFX 携手合作。

关于c# - 现在开始为任务并行库设计是否为时过早?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2156605/

有关c# - 现在开始为任务并行库设计是否为时过早?的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  4. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  5. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  8. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  9. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

  10. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

随机推荐