C# 确定字符串是否已修改的过程是否会导致性能下降?如果是这样,我们可以进一步优化吗?

C# 确定字符串是否已修改的过程是否会导致性能下降?如果是这样,我们可以进一步优化吗?,c#,optimization,C#,Optimization,我需要一种方法来检测字符串是否在我的代码中更改,但是,我同时对我的性能保持谨慎: 关于这一点 具体而言,此代码段: // holds a copy of the previous value for comparison purposes private string oldString = string.Empty; private void button6_Click(object sender, EventArgs e) { // Get the new string valu

我需要一种方法来检测
字符串
是否在我的代码中更改,但是,我同时对我的性能保持谨慎:

关于这一点

具体而言,此代码段:

// holds a copy of the previous value for comparison purposes
private string oldString = string.Empty; 

private void button6_Click(object sender, EventArgs e)
{
    // Get the new string value
    string newString = //some varying value I get from other parts of my program

    // Compare the old string to the new one
    if (oldString != newString)
    {
        // The string values are different, so update the ListBox
        listBox1.Items.Clear();
        listBox1.Items.Add(x + /*other things*/);   
    }

    // Save the new value back into the temporary variable
    oldString = newString;
}
我目前正在开发一个Grasshopper 3D组件。每个组件本身就是一个类库,
main
方法是一个名为
SolveInstance()
的方法。它运行的条件实际上我不是很确定,但我知道的是,它至少在一个部分中运行多次,因此您的图形用户界面几乎是实时的,或者说是人眼无法察觉的

对于我的特定示例,这就是我的特定案例(它是未经测试的psuedo代码)

我的问题是:如果某段代码每秒被调用多次,那么这样做会影响性能吗

如果某段代码每秒被多次调用,那么这样做会影响性能吗

但这并不是最重要的,重要的是它会不会造成重大的打击

这是一个需要多长时间的问题,与什么对你来说是重要的

知道的唯一方法是测量

然而,值得考虑的是,是什么使得某些字符串比较比其他字符串慢

最快的字符串比较是两个字符串实际上是完全相同的对象。特别是,

string a = "ABC";
string b = a;
bool c = a == b; // Very fast.
下一个最快的是一个,但不是两个都为null(无论如何,都为null是上述情况的一个示例)

第二个最快的是当它们有不同的长度时,对于那些如果它们有不同的长度就不能相等的比较类型。这不适用于区分大小写的比较,因为如果将“weißbier”大写为“WEISSBEIR”,长度会有所不同,但会精确匹配比较

第二个最快的是他们早期的分歧

最慢的情况是两个字符串是不同的对象,但实际上相等

字符串相等性测试的平均成本与字符串的长度成正比

我们可以通过插入字符串(无论是在默认的插入池中,还是在字符串的自定义缓存中)来降低最慢字符串的速度,如果我们知道所有字符串都经历了相同的过程,我们可以以最快的速度进行所有相等比较(因为我们已经确保两个字符串中的任何一个是相同的字符串,或者它们不是等价的)。但是这样做本身需要时间,所以并不总是值得的


总之,如果您只是在真正的更改中更改字符串,那么实际上要比您重复构建字符串快得多,最终可能会得到与开始时相同的字符串。

字符串比较应该是微秒或更少

你每次点击按钮只做一次

你能以多快的速度点击一个按钮-每秒十次

这意味着,在最坏的情况下,这种比较会花费你大约每秒10微秒,或者说0.001%的时间


不要担心任何花费不到1%的时间,甚至10%的时间的事情,因为如果你能修复它,它只会为你节省更多的时间。

这样做,当某段代码每秒被调用多次时,性能会受到影响吗?
-你可以通过基准测试来找到它,并尝试一下。没有办法r让我们知道它在做什么,或者需要多长时间。既然你已经有了代码,试一下,看看它是否需要太长的时间才能生效。@knittl文本字符串是内部的。运行时生成的字符串,而不是编译时的文本,除非程序员使用
s显式地内部的,否则不会内部的tring.Intern
。在这种情况下,字符串似乎是在运行时生成的,而不是在编译时生成的,因此它们不太可能被Intern。@Theodoroschatzigannakis
=
操作符将首先检查引用是否相等,并且仅在引用不相等时比较字符串的值。因为您无法确定所有引用不相等的字符串实际上是不同的,这是期望的行为。他肯定不应该将其更改为使用
ReferenceEquals
@Theodoroschatziganakis从技术上讲,这不是运算符的定义,它只是字符串重载实现的一个实现细节在上,它进行值比较,作为一种优化,它将引用检查为“提前退出”对于引用相等的实际情况。从技术上讲,这是一个实现细节,而不是规范的一部分。嘿,Jon。感谢您的深入回答。从我得到的结果来看,我应该使用
bool c=a==b
,因为我的条件检查器是正确的吗?嗯,这同样适用于
!=
oldString!=newString
wil如果它们是相同的实际字符串,则速度可能会一样快,但在其他情况下可能会变慢。了解哪种情况适用于您的情况需要分析
newString
如何设置其值。我做了一些更改,现在我使用
List
s而不是
string
s。我正在使用
cachedStrin比较
List
gList.SequenceEqual(newStringList)
。这会对性能有任何影响吗?
cachedStringList
被分配到一个
private
变量中,我还在代码末尾
\u cachedFirstList=firstList;
将新列表保存到临时
private
变量中。@thegreencolla:同样的想法。如果您只是在一个按钮上进行操作点击,你可以做更多的事情,在你注意到任何缓慢之前。UI应用程序变慢的地方是当它们开始访问数据库、文件IO和大屏幕时
string a = "ABC";
string b = a;
bool c = a == b; // Very fast.