- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设执行一个方法 CountString
,给定一个字符串数组和一个 int,返回长度大于该 int 的字符串的数量。如果我必须尽可能利用多核硬件,这样做是否足够:
public int CountString(string[] s, int i)
{
return s.AsParallel().Count( res => res.length > i);
}
或者我是否必须以某种方式使用 Tasks,甚至混合使用 task 和 PLinq?
只能考虑一个简单的例子,我知道这种方法对硬件性能影响不大。
我想知道这样做是否更好,使用 AsParallel()
,还是声明方法 async
并使用 在方法体中等待
(即使我不知道如何)。
最佳答案
编辑:
我发现你的实际问题有点误导,我会尝试回答故意的问题。特别是在这里,使用 AsParallel
将是一个很好的方法,因为实际上您不需要await
任何东西。由于您要处理集合,PLINQ 或 Paralle.ForEach 是不错的选择。当您具有自然的异步 I/O 绑定(bind)操作时,请考虑使用 async-await
。建议不要wrap synchronous methods with async wrappers.
如果您实际测试您的代码,您甚至可能会惊讶地发现并行这段代码实际上会对您的方法执行产生负面性能成本,具体取决于大小 你正在迭代的数组。
很多时候人们忘记了使用线程实际上是有开销的,即使使用线程池之外的线程也是如此。您必须进行最少的 CPU 密集型工作,这样才值得承受并行化的性能损失。
如果您的数组足够长,那么使用 AsParallel
应该就足够了。没有理由添加 Task
,因为 PLINQ 会很好地处理并行化。
好的,让我们实际测试这段代码。我将迭代一个充满 GUID 的 string[]
。这是代码:
主要方法:
void Main()
{
//JIT
Test(0);
Test(100);
Test(1000);
Test(10000);
Test(1000000);
Test(10000000);
}
public void Test(int itemAmount)
{
string[] strings = Enumerable.Range(0, itemAmount).Select(i => Guid.NewGuid()
.ToString()).ToArray();
var stopWatch = Stopwatch.StartNew();
CountStringInParallel(strings, itemAmount);
stopWatch.Stop();
Console.WriteLine("Parallel Call: String amount: {0}, Time: {1}",
itemAmount, stopWatch.Elapsed);
stopWatch.Restart();
CountStringSync(strings, itemAmount);
stopWatch.Stop();
Console.WriteLine("Synchronous Call: String amount: {0}, Time: {1}",
itemAmount, stopWatch.Elapsed);
}
并行和同步:
public int CountStringInParallel(string[] s, int i)
{
return s.AsParallel().Count( res => res.Length > i);
}
public int CountStringSync(string[] s, int i)
{
return s.Count(res => res.Length > i);
}
结果:
Parallel Call: String amount: 100, Time: 00:00:00.0000197
Synchronous Call: String amount: 100, Time: 00:00:00.0000026
Parallel Call: String amount: 1000, Time: 00:00:00.0000266
Synchronous Call: String amount: 1000, Time: 00:00:00.0000201
Parallel Call: String amount: 10000, Time: 00:00:00.0002060
Synchronous Call: String amount: 10000, Time: 00:00:00.0002003
Parallel Call: String amount: 1000000, Time: 00:00:00.0080492
Synchronous Call: String amount: 1000000, Time: 00:00:00.0135279
Parallel Call: String amount: 10000000, Time: 00:00:00.0744104
Synchronous Call: String amount: 10000000, Time: 00:00:00.1402474
可以看到最多10,000个字符串,同步方法实际上比并行方法更快。
关于c# - AsParallel() 或异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28092436/
我想知道 C# 中 AsParallel 和 AsParallel.Select() 之间的区别是什么,因为两者都返回 AsParallelQuery 的实例。考虑以下代码片段: var list =
如何限制AsParallel()预先读取并放入其内部缓冲区的项目数量? 这是一个例子: int returnedCounter; IEnumerable Enum() { while (tru
我有一个 EmpId 列表。我需要为此列表中的每个 EmpId 执行一些操作。 void ProcessEmp(EmpId empId) { // process the emp } 我可以使用
我毫不怀疑,对于客户端应用程序,AsParallel() 会带来一些开箱即用的性能提升。但是如果我在网络环境中使用它呢?假设我有一个小部件框架,它循环遍历所有小部件以获取它们的数据并呈现输出。这会很好
Stephen Toub 的书第 33 页 http://www.microsoft.com/download/en/details.aspx?id=19222 有代码 var pings = fro
我有以下 PLINQ 查询: // Let's get a few customers List customers = CustomerRepository.GetSomeCustomers();
下面的测试程序好像不会做深蹲。这是因为我正在测试一个小列表吗? static void Main(string[] args) { List list = 0.UpTo(4); Tes
所以主题就是问题。 我得到 AsParallel 方法返回包装器 ParallelQuery使用相同的 LINQ 关键字,但来自 System.Linq.ParallelEnumerable而不是 S
我看过这段代码,它使用 AsParallel() 和 Any() 来检查条件: bool IsAnyDeviceConnected() { return m_devices.Any(d => d
谁能给我解释一件事。据我了解 AsParallel() 在自己的任务中执行。那么,如果查询返回大量数据,当'foreach'开始执行Console.WriteLine时,变量'd'可以为空吗? var
在使用 Parallel.ForEach 时,我们可以选择定义并行选项并设置最大并行度,例如: Parallel.ForEach(values, new ParallelOptions {MaxDeg
我想使用 PLINQ 方法 AsParallel() 重写这个 Parallel.For 循环。据我所知, AsParallel() 需要将整个序列传递给它,例如创建数组 A,然后调用 A.AsPar
我有一个 List收藏,每个Boss都有2到10个助理职员。我正在对包括老板在内的所有员工进行分组。现在我有 List ,由此我正在使用 Parallel LINQ 搜索 "Raj",我可以在哪里放置
这段代码有什么区别: int[] tab = new int[] { 1, 2, 3, 4, 5 }; List result1 = (from t in tab
当我使用 AsParallel() 时,下一个操作在多线程中运行,那么,我在此查询中使用的方法应该是线程安全的? 在下一个示例中,Convert(string value) 方法不是线程安全的,但在作
假设执行一个方法 CountString,给定一个字符串数组和一个 int,返回长度大于该 int 的字符串的数量。如果我必须尽可能利用多核硬件,这样做是否足够: public int CountSt
我正在构建一个必须处理一堆文档的控制台应用程序。 为了简单起见,过程是: 对于 X 和 Y 之间的每一年,查询数据库以获取流程的文档引用列表 对于每个引用,处理一个本地文件 我认为 process 方
我用 List.AsParallel().WithDegreeOfParallelism(3).ForAll(x => Worker(x)); 在列表的每个元素上应用 Worker。 我如何命名运行
我对使用 LINQ AsParallel() 的并发性有一些疑问。 假设我有以下代码: int counter = 0; someList.AsParallel().ForEach(item => {
感谢观看。我有以下返回语句: //Return the result set return new FilterDto.FilterResult
我是一名优秀的程序员,十分优秀!