我有人被告知,因为.net linq是如此之慢,我们不应该使用它,并且想知道其他人是否得出了相同的结论,例如:
花了1443ms做了1000000000比较非LINQ.
花了4944ms与LINQ做了1000000000比较.
(慢243%)
非LINQ代码:
for (int i = 0; i < 10000; i++)
{
foreach (MyLinqTestClass1 item in lst1) //100000 items in the list
{
if (item.Name == "9999")
{
isInGroup = true;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
花了1443ms做了1000000000比较非LINQ.
LINQ代码:
for (int i = 0; i < 10000; i++)
isInGroup = lst1.Cast<MyLinqTestClass1>().Any(item => item.Name == "9999");
Run Code Online (Sandbox Code Playgroud)
花了4944ms与LINQ做了1000000000比较.
我想它可以优化LINQ代码,但想到的是它很容易得到非常慢的LINQ代码,并且考虑到它不应该被使用.鉴于LINQ很慢,那么PLINQ也会很慢,NHibernate LINQ会很慢,所以不应该使用LINQ语句中的任何类型.
有没有人发现LINQ是如此之慢以至于他们希望从未使用它,或者我是否根据这样的基准做出了过于笼统的结论?
我遇到了一些规则(建议)使用混凝土List和Dictionary,而不是IList和IDictionary给予,显示通过该接口访问样本测试是相当慢一点.例如,将10000个值添加到列表然后Count在列表上执行10亿次表示通过接口执行此操作比通过具体类执行它慢28倍.即,通过具体类需要80ms,通过界面需要2800ms,这表明它通过界面的速度非常慢.鉴于此,使用具体类是合理的.有没有理由说接口这么慢?(可能更多的是针对那些了解更多关于.net内部的人).
我们目前正在考虑设置我们的字符串列,nvarchar(max)而不是指定一个特定的长度,以防止在数据库中没有足够空间存储字符串的任何问题.我只是想知道这是不是一件好事,或者它是否会引起任何问题,因为它可以做到那时为什么要指定长度nvarchar(10)而不是nvarchar(max).我们也使用varbinary(max)了很多,因为我们不知道我们需要多少二进制数据所以我不知道这是多少效果或者说我们的插入没有我想的那么快.这是一个示例表:
CREATE TABLE [dbo].[SAMPLETABLE] (
[ID] [uniqueidentifier] NOT NULL,
[FIELD1] [int] NOT NULL,
[FIELD2] [nvarchar] (2000) NULL,
[FIELD3] [nvarchar] (max) NULL,
[FIELD4] [uniqueidentifier] NULL,
[FIELD5] [int] NULL,
[FIELD6] [nvarchar] (2000) NULL,
[FIELD7] [varbinary] (max) NULL,
[FIELD8] [varbinary] (max) NULL,
[FIELD9] [varbinary] (max) NULL,
[FIELD10] [uniqueidentifier] NULL,
[FIELD11] [nvarchar] (2000) NULL,
[FIELD12] [varbinary] (max) NULL,
[FIELD13] [varbinary] (max) NULL,
[FIELD14] [bit] NULL,
[FIELD15] [uniqueidentifier] NULL,
[FIELD16] [varbinary] (max) NULL,
[FIELD17] [bit] NULL,
[FIELD18] …Run Code Online (Sandbox Code Playgroud)