String 哪个更快-字符串相等或替换字符串

String 哪个更快-字符串相等或替换字符串,string,time-complexity,String,Time Complexity,我认为这可能有些过分,但我只是好奇。一般来说(如果有一般答案),假设字符串在50%的时间内彼此相等,则速度更快: void UpdateString1(string str1, string str2) { str1 = str2; } void UpdateString2(string str1, string str2) { if (str1 != str2) { str1 = str2; } } 如果您真的想检查str1!=str2,然后

我认为这可能有些过分,但我只是好奇。一般来说(如果有一般答案),假设字符串在50%的时间内彼此相等,则速度更快:

void UpdateString1(string str1, string str2)
{
    str1 = str2;
}

void UpdateString2(string str1, string str2)
{
    if (str1 != str2)
    {
        str1 = str2;
    }
}

如果您真的想检查str1!=str2,然后使用
str1=str2

  • 代码更短,更容易理解
  • 分支比赋值更复杂。如果将分配视为1个操作单元,则分支本身平均可能有1.5个操作单元,如果传入的数据是随机的,则可能会更多。见:
  • 为此进行优化是过分的

  • 假设用你的假设语言
    =表示“比较”,而
    =
    表示“复制”

    我要说的是,
    UpdateString1
    至少总是一样快

    假设字符串不相等。然后
    UpdateString2
    执行比较和赋值。所以它做了额外的工作

    假设字符串相等。然后,比较包括迭代两个字符串中的每个字符并对它们进行比较。这就是O(n)。类似地,复制最糟糕的情况是访问一个字符串中的每个字符并将其复制到第二个字符串。还有O(n)。同样的复杂性。同样的内存访问次数也是相同的

    但是,您也得到了不相等字符串的部分比较成本。我认为这有利于复制


    假设
    =
    =
    只是按身份而不是按值比较或更新引用


    所有操作成本均为O(1)和simuilar。
    =
    在100%的时间内是一次操作。
    =/
    =
    是预期的1.5次操作。

    其中
    =
    表示复制?在堆上的对象语言(如Java)中,答案可能有点明显。让我们假设它们是按值传递的。(这回答了你的问题吗?)对你来说很明显……对我来说不是,因此问题是:)我认为这取决于语言。@Tommy我在我的评论中键入了……按值传递,而不是引用我指的是按值传递。我的错。另外,他也没有寻找特定于java的答案。我的语法很好,答案很清楚,简洁易懂。谢谢:)我的好奇心已经解除了!