首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何确定并行foreach循环是否比foreach循环具有更好的性能?

如何确定并行foreach循环是否比foreach循环具有更好的性能?
EN

Stack Overflow用户
提问于 2016-11-05 13:22:56
回答 3查看 992关注 0票数 1

我刚刚在.NET中做了一个简单的测试,对长度为1000的100个随机整数数组进行排序,看看使用Paralell.ForEach循环是否比普通的旧foreach循环更快。

这是我的代码(我很快就把它们拼凑在一起了,所以请忽略代码的重复和整体糟糕的外观)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Net;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;

public class Program
{
    public static int[] RandomArray(int minval, int maxval, int arrsize)
    {
        Random randNum = new Random();
        int[] rand = Enumerable
            .Repeat(0, arrsize)
            .Select(i => randNum.Next(minval, maxval))
            .ToArray(); 
        return rand;
    }

    public static void SortOneThousandArraysSync()
    {
        var arrs = new List<int[]>(100);
        for(int i = 0; i < 100; ++i)
            arrs.Add(RandomArray(Int32.MinValue,Int32.MaxValue,1000));
        Parallel.ForEach(arrs, (arr) =>
        {
            Array.Sort(arr);
        });
    }

    public static void SortOneThousandArraysAsync()
    {
        var arrs = new List<int[]>(100);
        for(int i = 0; i < 100; ++i)
            arrs.Add(RandomArray(Int32.MinValue,Int32.MaxValue,1000));
        foreach(var arr in arrs)
        {
            Array.Sort(arr);
        };      
    }

    public static void Main()
    {
        var start = DateTime.Now;
        SortOneThousandArraysSync();
        var end = DateTime.Now;
        Console.WriteLine("t1 = " + (end - start).ToString());
        start = DateTime.Now;
        SortOneThousandArraysAsync();
        end = DateTime.Now;
        Console.WriteLine("t2 = " + (end - start).ToString());
    }
}

以下是两次击球后的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
t1 = 00:00:00.0156244
t2 = 00:00:00.0156243

..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
t1 = 00:00:00.0467854
t2 = 00:00:00.0156246

..。

所以,有时更快,有时也差不多。

可能的解释:

  • 在我运行的第二个测试中,对于同步数组和异步数组来说,随机数组“更没有排序”。
  • 这与运行在.NET Fiddle上的进程有关。在第一种情况下,平行的一个基本上像一个非平行的操作运行,因为没有任何线程让我的小提琴接管。(或诸如此类)

有什么想法?

EN

回答 3

Stack Overflow用户

发布于 2016-11-05 13:25:58

只有当循环中的代码需要大量时间才能执行时,才应该使用Parallel.ForEach()。在这种情况下,创建多个线程、对数组进行排序,然后将结果组合到一个线程上比在单个线程上对其排序要花费更多的时间。例如,下面的代码片段中的Parallel.ForEach()执行时间比普通的ForEach循环要少:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void Main(string[] args)
{
    var numbers = Enumerable.Range(1, 10000);

    Parallel.ForEach(numbers, n => Factorial(n));

    foreach (var number in numbers)
    {
        Factorial(number);
    }
}

private static int Factorial(int number)
{
    if (number == 1 || number == 0)
        return 1;

    return number * Factorial(number - 1);
}

但是,如果我将var numbers = Enumerable.Range(1, 10000);更改为var numbers = Enumerable.Range(1, 1000);,则ForEach循环要比Parallel.ForEach()快。

票数 2
EN

Stack Overflow用户

发布于 2016-11-05 13:56:36

在处理小任务(执行这些任务不需要花费大量时间)时,请查看分割器类;在您的示例中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void SortOneThousandArraysAsyncWithPart() {
  var arrs = new List<int[]>(100);

  for (int i = 0; i < 100; ++i)
    arrs.Add(RandomArray(Int32.MinValue, Int32.MaxValue, 1000));

  // Let's spread the tasks between threads manually with a help of Partitioner.
  // We don't want task stealing and other optimizations: just split the
  // list between 8 (on my workstation) threads and run them
  Parallel.ForEach(Partitioner.Create(0, 100), part => {
    for (int i = part.Item1; i < part.Item2; ++i)
      Array.Sort(arrs[i]);
  });
}

我得到了以下结果(i7 3.2GHz 4核HT,.Net 4.6IA-64)-平均运行100次:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0.0081 Async (foreach)
0.0119 Parallel.ForEach
0.0084 Parallel.ForEach + Partitioner

正如你所看到的,foreach仍然在顶端,但是Parallel.ForEach + Partitioner非常接近获胜者

票数 1
EN

Stack Overflow用户

发布于 2016-11-05 13:32:19

检查算法的性能是一项棘手的工作,小规模的性能很容易受到代码外部各种因素的影响。请参阅我在这里回答一个几乎重复的问题以获得更深入的解释,以及一些指向基准测试模板的链接,您可以通过这些链接来更好地衡量算法的性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40443350

复制
相关文章
愿未来没有 Webpack
现在是 1941 年。你的名字是 Richard Hubbell。你在 CBS 旗下的一个试验性的纽约电视演播室工作。你将要主持一场重大电视新闻广播,这是世界上首批电视节目之一,你还有 15 分钟就要上场了。你知道你一会儿要干嘛吗?
ConardLi
2019/09/10
6570
愿未来没有 Webpack
webpack版本问题_webpack查询有没有安装
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169196.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
6560
Sass/Scss、Less 是什么?
Sass (Syntactically Awesome Stylesheets) 是一种动态样式语言,Sass 语法属于缩排语法,比 css 比多出好些功能 (如变量、嵌套、运算,混入 (Mixin)、继承、颜色处理,函数等),更容易阅读。
CRMEB商城源码
2022/08/02
1.2K0
从webpack到rollup
这种代码读起来相当费劲,先找到_myModule2对应的__webpack_require__id,再找对应的模块定义,最后看该模块exports身上挂了什么东西。模块定义这个部分很讨厌,延长了阅读引用链
ayqy贾杰
2019/06/12
1.5K0
从webpack到rollup
Webpack之before快速创建接口
上次分享了用webpack的express模块快速启动一个服务接口,其实webpack还有HTTP模块也可以快速创建接口,有兴趣的可以去查查。今天要分享的也是基于express,但是是通过webpack的decServer创建的,不存在跨域问题。
wade
2020/04/24
5160
给初学者的Gulp教程(译)
Gulp是一个在你开发web时,帮助你完成几个任务的工具。它经常用来进行一些前端任务,比如:
治电小白菜
2020/08/25
4.4K0
给初学者的Gulp教程(译)
webpack 从入门到放弃
Webpack + ES6 已经成为目前最流行的前端解决方案,本文是 Webpack2 学习教程。
李振
2021/11/26
5910
创建没有按钮的UIAlertView
默认的,UIAlertView都有一个或者多个按钮,如果你想创建没有按钮的UIAlertView,可以使用以下的方法:
EltonZheng
2021/01/26
1.3K0
创建没有按钮的UIAlertView
webpack原理分析
loader原理loader 概念帮助 webpack 将不同类型的文件转换为 webpack 可识别的模块。loader 执行顺序了解执行顺序之前,需要先了解loader的分类pre: 前置 loadernormal: 普通 loaderinline: 内联 loaderpost: 后置 loader执行顺序4 类 loader 的执行优级为:pre > normal > inline > post 。相同优先级的 loader 执行顺序为:从右到左,从下到上。 // 此时loader执行顺序:lo
程序猿川子
2022/06/10
1300
webpack从0到1构建
webpack是一个静态打包工具,根据入口文件构建一个依赖图,根据需要的模块组合成一个bundle.js或者多个bundle.js,用它来展示静态资源
Maic
2022/07/28
1.3K0
webpack从0到1构建
webpack从零搭建开发环境
为了方便也可以这么写,使用 npm run 命令这个命令执行的时候默认会把 node_modules 的.bin 文件放到全局上,执行之后销毁npm run buildnpm run dev
小丑同学
2020/09/21
1.3K0
从零认识webpack4.0,带你走进神秘的webpack
前言: 作为一个现代javascript 应用程序的静态模块打包器,webpack能将各种资源,如js,css, 图片等作为模块来处理,是当下前端工程化的一个很受欢迎的工具,webpack目前最新的版本是4.0,文章将在4.0 的基础上,从使用者的角度,一步步教你认识并搭建一个简单的webpack配置项目,当然webpack的配置和使用较为丰富且复杂。
前端老鸟
2019/07/29
4680
从零认识webpack4.0,带你走进神秘的webpack
关于Parcel你需要知道的所有内容:超快的Web应用打包器
本文最初发布于 Medium 上 freeCodeCamp 的博客站点,经原作者授权由 InfoQ 中文站翻译并分享。 什么?又有一个打包器(bundler)/ 构建工具?是的——果真如此,演化和创新相结合为我们带来了 Parcel: https://parceljs.org/ Parcel 有什么特殊之处,为什么值得关注呢? webpack 要有大量的配置,这样带来的成本就是复杂性——与此相对的,Parcel 带来了简洁性。Parcel 将自己标榜为“零配置”。 Parcel 内置了一个开发服务器
企鹅号小编
2018/02/07
1.1K0
关于Parcel你需要知道的所有内容:超快的Web应用打包器
基于webpack,不使用任何脚手架,创建纯粹的webpack项目
1.新建一个目录,通过 npm init 初始化一个项目,这个时候仅生成一个package.json 文件,如下:
问问计算机
2023/02/24
6980
基于webpack,不使用任何脚手架,创建纯粹的webpack项目
webpack学习(四)extract-text-webpack-plugin插件
二、extract-text-webpack-plugin插件 从 bundle 中提取文本(CSS)到单独的文件 安装 npm install extract-text-webpack-plugin --save-dev  用法 var ExtractTextPlugin = require("extract-text-webpack-plugin"); module.exports = { module: { rules: [ { test: /\.css$/
柴小智
2018/04/10
8900
从Highlight浅谈Webpack按需加载
最近有在使用 highlight.js 做代码的高亮展示,主要是展示对 SQL 语言的处理。看了看 highlight.js 的提供的相关代码
MrTreasure
2018/08/09
2K0
从Highlight浅谈Webpack按需加载
我们为什么从 Webpack 转向 Vite
作者 | Sergei Chestakov 译者 | 王强 策划 | 李俊辰 在 Replit,我们的使命是让更多人轻松编写代码。我们为大家提供了免费的云端计算资源,让人们可以在任何设备上构建应用。如今,React 是 Web 上最流行的应用创建方法之一。但长期以来,React 工具链在 Replit 上跑得都很慢。尽管 JavaScript 生态系统为专业开发人员提供了很多出色的工具,但其中许多最流行的工具(例如 Create React App 和 Webpack)逐渐变得愈加复杂和效率低下。 所幸我们
深度学习与Python
2023/04/01
4330
我们为什么从 Webpack 转向 Vite
创建maven项目没有显示项目结构
有一些同学创建Maven项目尤其是从git库中拉取了Maven项目之后没有显示项目结构,该怎么办??
明明如月学长
2021/08/31
1.1K0
创建maven项目没有显示项目结构
初探webpack之从零搭建Vue开发环境
平时我们可以用vue-cli很方便地搭建Vue的开发环境,vue-cli确实是个好东西,让我们不需要关心webpack等一些繁杂的配置,然后直接开始写业务代码,但这会造成我们过度依赖vue-cli,忽视了webpack的重要性,当遇到一些特殊场景时候,例如Vue多入口的配置、优化项目的打包速度等等时可能会无从下手。当然现在才开始学习vue2 + webpack可能有点晚,毕竟现在都在考虑转移到vue3 + vite了哈哈。
WindRunnerMax
2021/10/20
1.2K1
创建MySQL从库
我们知道Oracle有DataGuard实时备份数据。能够做主备切换,而MySQL也有自己的一套备库方案。称之为主从复制。
全栈程序员站长
2022/07/10
1.6K0

相似问题

告诉角为`styles.css`而不是`styles.scss`服务

38

可以将全局styles.css文件转换为styles.scss吗?

10

我如何在maven原型中实现一个主题?(styles.css、styles.scss等)

111

Angular2 Webpack资产与全球styles.css

12

Webpack建设成功,但styles.css文件风格没有体现出来

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文