C# 这种方法有什么作用?

C# 这种方法有什么作用?,c#,parallel-processing,max,C#,Parallel Processing,Max,我发现有两种不同的方法可以从数组中获取最大值,但我不太喜欢并行编程,所以我真的不理解它 我想知道这些方法是否也一样,或者我遗漏了什么? 我真的没有太多关于他们的信息。甚至连评论都没有 第一种方法: int[] vec = ... (I guess the content doesn't matter) static int naiveMax() { int max = vec[0]; object obj = new object(); Parallel.For(0,

我发现有两种不同的方法可以从数组中获取最大值,但我不太喜欢并行编程,所以我真的不理解它

我想知道这些方法是否也一样,或者我遗漏了什么? 我真的没有太多关于他们的信息。甚至连评论都没有

第一种方法:

int[] vec = ... (I guess the content doesn't matter)

static int naiveMax()
{
    int max = vec[0];
    object obj = new object();

    Parallel.For(0, vec.Length, i =>
    {
        lock (obj) {
                if (vec[i] > max) max = vec[i];
        }
    });

    return max;
}
第二个:

static int Max()
{
    int max = vec[0];
    object obj = new object();

    Parallel.For(0, vec.Length,     //could be Parallel.For<int>
        () => vec[0],
        (i, loopState, partial) =>
    {
        if(vec[i]>partial) partial = vec[i];
        return partial;
    },
    partial => {
            lock (obj) {
                    if( partial > max) max = partial;
            }
    });
    return max;
}
static int Max()
{
int max=vec[0];
object obj=新对象();
Parallel.For(0,vec.Length,//可以是Parallel.For
()=>vec[0],
(i,循环状态,部分)=>
{
如果(vec[i]>partial)partial=vec[i];
返回部分;
},
部分=>{
锁(obj){
如果(部分>最大)最大=部分;
}
});
返回最大值;
}

这些功能是相同的还是不同的?谢谢;)

两者都在整数数组中查找最大值。为了更快地找到最大值,他们使用。不过,这两种方法都失败了

要看到这一点,我们首先需要一个足够大的整数数组。对于小型阵列,并行处理并没有给我们带来任何加速

int[] values = new int[100000000];
Random random = new Random();
for (int i = 0; i < values.Length; i++)
{
    values[i] = random.Next();
}
所以
Max
naiveMax
(6分钟!咳嗽)要好得多

但是,它与,比如说,相比如何呢

MaxPlinq 00:00:11.2335842
不错,节省了几秒钟。现在,用一个简单的、旧的、顺序的
for
循环进行比较怎么样

static int Simple(int[] values)
{
    int result = values[0];
    for (int i = 0; i < values.Length; i++)
    {
        if (result < values[i]) result = values[i];
    }
    return result;
}
我想我们赢了

吸取的教训:难道你不能把精灵的灰尘撒在你的代码上吗
让它神奇地跑得更快。如果绩效很重要,请使用正确的工具,测量、测量、测量……

它们似乎在做同样的事情,但效率非常低。并行化的目的是提高可以独立执行的代码的速度。由于竞争条件,发现最大值(此处实现)需要实际逻辑上的原子信号量/锁。。。这意味着您正在旋转许多线程和相关资源,只是为了按顺序执行代码。。。完全违背了并行化的目的。

在我看来,这些锁上会有大量的旋转:/为什么不尝试一下这两种方法,看看它们的区别呢?这两种方法都会通过强制并行化的代码按顺序运行来浪费大量资源。即使没有锁(这会使代码按顺序运行,因此根本不并行)如此小的计算量并不适合并行执行。开销将比用于计算的时间更高。谢谢你,伙计。这不是我的代码,这就是我不理解的原因。我刚刚读了一些关于并行计算的幻灯片,我发现了这些方法。现在我看到差异只是在找到最大值所花费的时间上。
static int Simple(int[] values)
{
    int result = values[0];
    for (int i = 0; i < values.Length; i++)
    {
        if (result < values[i]) result = values[i];
    }
    return result;
}