小编Leo*_*ger的帖子

检查Double是否为"NaN"的最短方式

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)

.net c# floating-point

35
推荐指数
2
解决办法
4万
查看次数

为什么List <string> .Sort()慢?

所以我注意到树视图花了很长时间才排序,首先我发现在添加每个已排序的项目后,大部分时间都花在重新绘制控件上.但无论如何,我有一种直觉感觉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)

c# string comparison performance list

6
推荐指数
2
解决办法
1279
查看次数

JIT拒绝内联微小的方法

我缺少严肃的优化,因为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,这是绝对错误的.为什么这么小的方法不适合内联?对于注释,这是在优化的基础上编译的.

.net c# optimization jit inline

2
推荐指数
2
解决办法
494
查看次数

标签 统计

c# ×3

.net ×2

comparison ×1

floating-point ×1

inline ×1

jit ×1

list ×1

optimization ×1

performance ×1

string ×1