C# 优化这段c代码

C# 优化这段c代码,c#,optimization,C#,Optimization,问题:给定一个逗号分隔的数字字符串,要找出数字的最高平均数。 例如:考虑一个数字“123345555”,输出将是5,因为5是123345555之间的最高平均值。 这是我的C语言程序# int Max\u Avg(字符串编号列表) { int i; Int32总和; Int32最大平均值=0; 整数极限=0; 字符串[]num=number_list.Split(','); 限制=数量长度; 同时(限制-->0) { i=0; 总和=0; while(i最大平均值) { 最大平均值=tmp; }

问题:给定一个逗号分隔的数字字符串,要找出数字的最高平均数。 例如:考虑一个数字“123345555”,输出将是5,因为5是123345555之间的最高平均值。 这是我的C语言程序#

int Max\u Avg(字符串编号列表)
{
int i;
Int32总和;
Int32最大平均值=0;
整数极限=0;
字符串[]num=number_list.Split(',');
限制=数量长度;
同时(限制-->0)
{
i=0;
总和=0;
while(i最大平均值)
{
最大平均值=tmp;
}
}
返回最大平均值;
}
如果可以的话,可以优化其性能或建议一种更优化的方法来加速……

(针对可维护性/代码而不是原始性能进行优化)

(针对可维护性/代码而不是原始性能进行了优化)


我看到的唯一合理的速度优化如下:

Convert.ToInt32(num[limit].子字符串(i,1))

这很慢-您可以按字符将字符串拆分为子字符串,然后使用通用解析器

子函数可以获取一个字符,然后切换10个有效值(0-9),或者直接将字符的数字值转换为数字。这就是你所能做的。我认为COnvert.ToInt32方法过于通用,在这里不可能很快


只有当你这样做了数千次之后才有意义,但见鬼,我编写数据解析器的时候,这样的优化会显著提高它们。

我看到的唯一合理的速度优化是在这一行:

Convert.ToInt32(num[limit].子字符串(i,1))

这很慢-您可以按字符将字符串拆分为子字符串,然后使用通用解析器

子函数可以获取一个字符,然后切换10个有效值(0-9),或者直接将字符的数字值转换为数字。这就是你所能做的。我认为COnvert.ToInt32方法过于通用,在这里不可能很快


只有在你做了数千次之后才有意义,但是见鬼,我写数据解析器的时候,像这样的优化会大大提高它们。

这是我的版本,在我看来有点干净,但可能不会快很多

int Max_Avg(string number_list)
{
    int result = 0;
    var numbers = number_list.Split(',');
    foreach (var num in numbers)
    {
        var total = 0.0;
        foreach (var ch in num)
        {
            total += (int) ch;
        }
        var avg = total/num.Length;
        result = avg > result ? avg : result;
    }
    return result;
}

这是我的版本,在我看来稍微干净一点,但可能不会快很多

int Max_Avg(string number_list)
{
    int result = 0;
    var numbers = number_list.Split(',');
    foreach (var num in numbers)
    {
        var total = 0.0;
        foreach (var ch in num)
        {
            total += (int) ch;
        }
        var avg = total/num.Length;
        result = avg > result ? avg : result;
    }
    return result;
}
int Max\u Avg(字符串编号列表)
{
var结果=0;
var总和=0;
var计数=0;
对于(变量i=0;i0)
{
结果=数学最大值(结果、总和/计数);
总和=0;
计数=0;
}
}
其他的
{
sum+=数字_列表[i]-“0”;
计数++;
}
}
返回结果;
}
int Max\u Avg(字符串编号列表)
{
var结果=0;
var总和=0;
var计数=0;
对于(变量i=0;i0)
{
结果=数学最大值(结果、总和/计数);
总和=0;
计数=0;
}
}
其他的
{
sum+=数字_列表[i]-“0”;
计数++;
}
}
返回结果;
}

在哪些方面进行优化?内存/时间复杂度/性能/代码行数?输出是否为5(平均值为5,5,5)对不起我的错误…它的更新我不是一个好人,并采集了一些样本,但我首先想到的是使用
子字符串。这将构建一个新字符串,点击
new
(这是一件昂贵的事情)。然后,它将尝试将该字符串解析为整数(另一项代价高昂的工作)。当然,它必须对自己制作的字符串进行垃圾收集。这需要很多优化器来解决。你只需要对平均值进行整数除法。这真的是你想要的吗?在什么方面进行优化?内存/时间复杂度/性能/代码行数?输出是否为5(平均值为5,5,5)对不起我的错误…它的更新我不是一个好人,并采集了一些样本,但我首先想到的是使用
子字符串。这将构建一个新字符串,点击
new
(这是一件昂贵的事情)。然后,它将尝试将该字符串解析为整数(另一项代价高昂的工作)。当然,它必须对自己制作的字符串进行垃圾收集。这需要很多优化器来解决。你只需要对平均值进行整数除法。这真的是你想要的吗?事实上,这应该正好是
(int)(num[limit][i]-“0”)
。应该是一个紧密的循环。实际上你也可以去掉数组,把它变成一个指针——另一个优化;)但需要不安全的priviledge。它是通过索引而不是字符数组访问字符串。您可能可以通过索引器处理整个字符串来避免数组被拆分(以及额外的字符串),但是……这不好吗?同意但有时毫秒很重要。我分析市场数据和历史数据负载需要数周的时间——在一个循环中运行,这在某些地方几乎就是这样。上周我通过这样的优化将速度提高了三倍。事实上,这应该正好是
(int)(num[limit][I]-“0”)
。应该是一个紧密的循环。实际上你也可以去掉数组,把它变成一个指针——另一个优化;)但需要不安全的priviledge。它是通过索引而不是字符数组访问字符串。你可能会
int Max_Avg(string number_list)
{
    int result = 0;
    var numbers = number_list.Split(',');
    foreach (var num in numbers)
    {
        var total = 0.0;
        foreach (var ch in num)
        {
            total += (int) ch;
        }
        var avg = total/num.Length;
        result = avg > result ? avg : result;
    }
    return result;
}
int Max_Avg(string number_list)
{
    var result = 0;
    var sum = 0;
    var count = 0;
    for (var i = 0; i < number_list.Length; i++)
    {
       if (number_list[i] == ',')
       {
          if (count > 0)
          {
              result = math.Max(result, sum / count);
              sum = 0;
              count = 0;
          }
       }
       else
       {
          sum += number_list[i] - '0';
          count++;
       }
    }
    return result;
}