Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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# 在循环内部或外部初始化字符串的效率_C#_String_Performance_Memory Management - Fatal编程技术网

C# 在循环内部或外部初始化字符串的效率

C# 在循环内部或外部初始化字符串的效率,c#,string,performance,memory-management,C#,String,Performance,Memory Management,在C#console应用程序中,我有一个循环,循环遍历集合中的大约8000个项,将大约8个字符串设置为等于项的各种属性,然后使用这些字符串执行大量其他操作。为了保持代码的条理性,我提前声明了所有字符串,并将它们保留为null,直到读取一个项,循环将相应的字符串设置为相应的值。我的问题是,在循环外声明这些字符串与在循环内声明这些字符串之间是否存在明显的性能差异?我知道,从技术上讲,每次循环迭代时,它都会消耗一些额外的时钟周期,在8000次迭代之后,这些时钟周期可能开始累积,但我不知道有多少,或者这

在C#console应用程序中,我有一个循环,循环遍历集合中的大约8000个项,将大约8个字符串设置为等于项的各种属性,然后使用这些字符串执行大量其他操作。为了保持代码的条理性,我提前声明了所有字符串,并将它们保留为null,直到读取一个项,循环将相应的字符串设置为相应的值。我的问题是,在循环外声明这些字符串与在循环内声明这些字符串之间是否存在明显的性能差异?我知道,从技术上讲,每次循环迭代时,它都会消耗一些额外的时钟周期,在8000次迭代之后,这些时钟周期可能开始累积,但我不知道有多少,或者这是否重要?这个应用程序已经花了半个小时来完成它的整个周期,所以几秒钟的差异是微不足道的,但是如果我们说的是分钟,显然这是一件坏事

请记住,这主要是一个好奇的问题,我可以诚实地声明这些变量,而不会影响应用程序。我确信最佳实践表明,它们应该始终处于循环之外,但我一直想知道,在这种低影响的操作中,它到底有多大的不同

我的问题是,在循环外声明这些字符串与在循环内声明这些字符串之间是否存在明显的性能差异

不会的。您正在重新初始化循环中的字符串。如果有什么需要的话,可以通过在循环外初始化代码,然后在循环内再次初始化代码,使程序做更多的工作。不过我猜编译器会优化它


我知道每次循环迭代时,它都会消耗一些额外的时钟周期

您应该让编译器完成它的工作,并为您优化它。试图完成编译器的工作只会让您感到沮丧,并使优化代码变得更加困难。这很可能也是完全不真实的

我的问题是,在循环外声明这些字符串与在循环内声明这些字符串之间是否存在明显的性能差异

不会的。您正在重新初始化循环中的字符串。如果有什么需要的话,可以通过在循环外初始化代码,然后在循环内再次初始化代码,使程序做更多的工作。不过我猜编译器会优化它


我知道每次循环迭代时,它都会消耗一些额外的时钟周期

您应该让编译器完成它的工作,并为您优化它。试图完成编译器的工作只会让您感到沮丧,并使优化代码变得更加困难。这很可能也是完全不真实的

我的问题是,在循环外声明这些字符串与在循环内声明这些字符串之间是否存在明显的性能差异

不会的。您正在重新初始化循环中的字符串。如果有什么需要的话,可以通过在循环外初始化代码,然后在循环内再次初始化代码,使程序做更多的工作。不过我猜编译器会优化它


我知道每次循环迭代时,它都会消耗一些额外的时钟周期

您应该让编译器完成它的工作,并为您优化它。试图完成编译器的工作只会让您感到沮丧,并使优化代码变得更加困难。这很可能也是完全不真实的

我的问题是,在循环外声明这些字符串与在循环内声明这些字符串之间是否存在明显的性能差异

不会的。您正在重新初始化循环中的字符串。如果有什么需要的话,可以通过在循环外初始化代码,然后在循环内再次初始化代码,使程序做更多的工作。不过我猜编译器会优化它


我知道每次循环迭代时,它都会消耗一些额外的时钟周期


您应该让编译器完成它的工作,并为您优化它。试图完成编译器的工作只会让您感到沮丧,并使优化代码变得更加困难。这很可能也是完全不真实的

首先,对于现代计算机来说,8000是一个相对较小的数字,因此我不会担心诸如声明变量或使用属性之类的小事,因为它们之间的差异可以忽略不计。我认识一位同事,他坚持在我们为一个花了几分钟时间的操作优化代码时不使用属性。我一直告诉他,他把我们的时间浪费在一些微不足道的事情上,但他成功地说服了团队,他们在没有我的情况下进行了测试。这个循环有100万次迭代,但相差不到半秒

现在在你的情况下,我相信实际上不会有任何区别。再说一次,8000太小了,如果它存在的话,甚至懒得去思考它的区别

至于最佳实践,实际上恰恰相反。作用域应该尽可能小,所以在循环中声明它们


首先,对于现代计算机来说,8000是一个相对较小的数字,因此我不必担心诸如声明变量或使用属性之类的小事,因为它们之间的差异可以忽略不计。我认识一位同事,他坚持在我们为一个花了几分钟时间的操作优化代码时不使用属性。我一直告诉他,他把我们的时间浪费在一些微不足道的事情上,但他成功地说服了团队,他们在没有我的情况下进行了测试。这个循环有100万次迭代,但相差不到半秒

现在在你的情况下,我相信实际上不会有任何区别。再说一次,8000太小了,如果它存在的话,甚至懒得去思考它的区别

至于
internal class Program
{
    private static string InnerLoop()
    {
        var sb = new StringBuilder();

        string s;
        for (int i = 0; i < 8000; i++)
        {
            s = i.ToString();
            sb.Append(s);
        }

        return sb.ToString();
    }

    private static string OuterLoop()
    {
        var sb = new StringBuilder();

        for (int i = 0; i < 8000; i++)
        {
            string s;
            s = i.ToString();
            sb.Append(s);
        }

        return sb.ToString();
    }

    private static void Main(string[] args)
    {
        Console.WriteLine(InnerLoop());
        Console.WriteLine(OuterLoop());
    }
}