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.