Double.IsNaN()使用Double.PositiveInfinityas参数调用时,结果为false.这是违背我的直觉的,因为无穷大不是一个数字.显然"NaN"只存在于.NET中的常量,是IEEE标准描述的还是自定义实现细节?是否有更短的方法来检查a Double是否为"NaN"而不是:
(Double.IsNaN(d) || Double.IsPositiveInfinity(d) || Double.IsNegativeInfinity(d))
Run Code Online (Sandbox Code Playgroud)
要么
(Double.IsNaN(d) || Double.IsInfinity(d))
Run Code Online (Sandbox Code Playgroud) 所以我注意到树视图花了很长时间才排序,首先我发现在添加每个已排序的项目后,大部分时间都花在重新绘制控件上.但无论如何,我有一种直觉感觉List<T>.Sort()花费的时间超过了合理时间,因此我使用自定义排序方法对其进行基准测试.结果很有趣,List<T>.Sort()花费了大约20倍,这是我在.NET中遇到过如此简单的任务所遇到的最大失望.
我的问题是,这可能是什么原因?我的猜测是调用比较委托的开销,进一步必须调用String.Compare()(在字符串排序的情况下).增加列表的大小似乎会增加性能差距.有任何想法吗?我正在尝试尽可能多地使用.NET类,但在这种情况下我不能.
编辑:
static List<string> Sort(List<string> list)
{
if (list.Count == 0)
{
return new List<string>();
}
List<string> _list = new List<string>(list.Count);
_list.Add(list[0]);
int length = list.Count;
for (int i = 1; i < length; i++)
{
string item = list[i];
int j;
for (j = _list.Count - 1; j >= 0; j--)
{
if (String.Compare(item, _list[j]) > 0)
{
_list.Insert(j + 1, item);
break;
}
}
if (j == -1)
{
_list.Insert(0, item); …Run Code Online (Sandbox Code Playgroud) 我缺少严肃的优化,因为JIT不会内联我的很多方法.
例如,让我们有以下代码:
static void Main(string[] args)
{
IsControl('\0');
}
public static bool IsControl(char c)
{
return ((c >= 0 && c <= 31) || (c >= 127 && c <= 159));
}
Run Code Online (Sandbox Code Playgroud)
在JIT编译之后生成以下内容:
0000001f xor ecx,ecx
00000021 call FFFFFFFFFFEC9760
00000026 mov byte ptr [rsp+20h],al
0000002a nop
0000002b jmp 000000000000002D
0000002d add rsp,38h
00000031 rep ret
Run Code Online (Sandbox Code Playgroud)
请注意,这0000001f是我设置断点的地方.你可以看到有一个电话00000021,这是绝对错误的.为什么这么小的方法不适合内联?对于注释,这是在优化的基础上编译的.