Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:将int[]转换为字符串的最高效率_C#_Performance_Optimization - Fatal编程技术网

C#:将int[]转换为字符串的最高效率

C#:将int[]转换为字符串的最高效率,c#,performance,optimization,C#,Performance,Optimization,我发布了一个新的帖子,因为上一个帖子非常混乱,而且这个想法也被修改了。我在很多地方修改了程序,没有降低效率(甚至有一点提高),现在我像以前一样有了一个简单的整数数组,不需要分隔符 我知道这类问题已经回答过很多次了。虽然我已经找到了很多可能的答案,但它们仍然不能解决我的问题,这是实现将整数数组转换为单个字符串的最快方法 那好吧 int[] Result = new int[] { 636, 1000234545, 1353678530, 987001 } 我应该得到: 636000234545

我发布了一个新的帖子,因为上一个帖子非常混乱,而且这个想法也被修改了。我在很多地方修改了程序,没有降低效率(甚至有一点提高),现在我像以前一样有了一个简单的整数数组,不需要分隔符

我知道这类问题已经回答过很多次了。虽然我已经找到了很多可能的答案,但它们仍然不能解决我的问题,这是实现将整数数组转换为单个字符串的最快方法

那好吧

int[] Result = new int[] { 636, 1000234545, 1353678530, 987001 }
我应该得到:

636000234545353678530987001
请注意,我只取了每个元素的最后9位数字。以下是本札·布雷斯坦的更正版本:

StringBuilder sb = new StringBuilder();

for (var i = 0; i < xC; i++)
{
    tempint = Result[i];
    if (tempint > 999999999)
        sb.Append((Result[i]).ToString().Substring(1, 9));
    else
        sb.Append((Result[i]).ToString());
}
return sb.ToString();
StringBuilder sb=新建StringBuilder();
对于(变量i=0;i9999999)
sb.Append((结果[i]).ToString().Substring(1,9));
其他的
sb.追加((结果[i])ToString());
}
使某人返回字符串();
我的,老的,纠正了:

//Base – a string array of integers saved as strings {“000”, “001”, … , “999” }
string[] arr = new string[3 * limit];
int x; // temp value

for (int i = 0; i < limit; i++)
{
    x = Result[i];

    if (x > 999999)
    {
        arr [3 * i + 2] = Base [x % 1000];
        arr [3 * i + 1] = Base [x / 1000 % 1000];
        arr [3 * i] = Base [x / 1000000 % 1000];
    }
    else
    {
        if (x < 1000)
        {
            arr [3 * i + 2] = Base [x % 1000];
        }
        else
        {
            arr [3 * i] = Base [x / 1000 % 1000];
            arr [3 * i + 1] = Base [x % 1000];
        }
    }
}
return string.Join(null, arr);
//Base–保存为字符串{“000”、“001”、…、“999”}的整数字符串数组
字符串[]arr=新字符串[3*限制];
int x;//温度值
对于(int i=0;i999999)
{
arr[3*i+2]=基数[x%1000];
arr[3*i+1]=基准[x/1000%1000];
arr[3*i]=基数[x/1000000%1000];
}
其他的
{
如果(x<1000)
{
arr[3*i+2]=基数[x%1000];
}
其他的
{
arr[3*i]=基准[x/1000%1000];
arr[3*i+1]=基数[x%1000];
}
}
}
返回string.Join(null,arr);
现在是速度的不同: Honza:689毫秒 我的:331毫秒


有没有办法提高速度?也许使用汇编程序?

那么并行性呢,也许它对您有帮助

    int[] list = new int[100];
    Random rand = new Random();
    for(int k = 0; k < list.Length; k++)
    {
        list[k] = rand.Next(0, 200000);
    }
    object monitor = new object();
    var stopwatch = System.Diagnostics.Stopwatch.StartNew();

    char[] result = new char[list.Length * list.Max().ToString().Length];//worst case scenario.
    for (int j = 0; j < 120000; j++)
    {
        //partitioning.
        Parallel.ForEach(Partitioner.Create(0, list.Length), () => 0.0, (range, state, local) =>
        {
            StringBuilder xc = new StringBuilder();
            for (int i = range.Item1; i < range.Item2; i++)
            {
                //split the number into characters.
                int number = list[i];
                int index = i;
                do
                {
                    int lsd = number % 10;       // Get least significant // digit
                    result[index++] = (char)(lsd + 47);
                    number /= 10;                        // Prepare for next most  // significant digit
                } while(number != 0);
            }
            return 0.0;
        }, local => {});
    }
    stopwatch.Stop(); MessageBox.Show(stopwatch.ElapsedMilliseconds.ToString());
int[]list=newint[100];
Random rand=新的Random();
for(int k=0;k0.0,(范围、状态、本地)=>
{
StringBuilder xc=新的StringBuilder();
对于(int i=range.Item1;i{});
}
秒表;Show(stopwatch.elapsedmillesons.ToString());
对于优化,您希望尝试不安全的代码,这将产生更好的性能。C#做一些安全检查,这会让事情变得更慢。例如数组索引检查


始终以正确的大小分配缓冲区,并尝试避免string.Join

好的,我相信我解决了我的问题;)只是为了那些想利用我所做的事情的人。就在我对两个函数进行基准测试之前,这两个函数几乎相同,只是与上一部分不同,即将整数数组转换为单个字符串

//Function one:
StringBuilder sb = new StringBuilder();
if (iscarry) sb.Append("1");
xC++;
for (iX = 0; iX < xC; iX++)
{
    tempint = Result[iX];

    if (tempint > 99999)
    {
        sb.Append(SmallBase[tempint / 100000 % 10000]);
        sb.Append(BigBase[tempint % 100000]);
    }
    else
    {
        sb.Append(BigBase[tempint % 100000].TrimStart('0'));
    }
}

return sb.ToString();

//Function two:
xC++;
AnswerArr = new string[2 * xC];
for (iX = 0; iX < xC; iX++)
{
    tempint = Result[iX];

    if (tempint > 99999)
    {
        AnswerArr[2 * iX] = SmallBase[tempint / 100000 % 10000];
        AnswerArr[2 * iX + 1] = BigBase[tempint % 100000];
    }
    else
    {
        AnswerArr[2 * iX] = BigBase[tempint % 100000].TrimStart('0');
    }
}

return string.Join(null, AnswerArr).TrimStart('0');
这并不意味着什么,这是一个微不足道的区别。所以我又做了一次,最多1.280.000个数字

with StringBuilder: 5242 ms.
with array & string.Join: 5248 ms.
我可以说,选择哪条路取决于你。字符串生成器更容易理解,占用的空间更少。使用数组的第二种方法更为奇特:D


我想就这些。。。希望这有帮助。谢谢收听。和平

您有多大信心这真的是您系统中的瓶颈?瓶颈?我不明白你的意思。。。对不起,我不是以英语为母语的人。你能用别的话说吗?@Randolph:瓶颈=在性能上花费你最多的东西。在总体方案中(不仅仅是在一个操作中),这在多大程度上导致了应用程序的性能低下?你需要多快?(如果你没有任何绩效目标,你怎么知道你什么时候完成了?@Jon Skeet-谢谢你的解释。我正在为比赛写一个程序。它应该计算数十亿个案例,我需要优化的部分是一个函数的一小部分,它可以添加保存为字符串的巨大整数。加法对于Karatsuba乘法算法是必要的。
with StringBuilder: 5242 ms.
with array & string.Join: 5248 ms.