小编ili*_*rit的帖子

不存在而不是存在

哪个查询更快?

不存在:

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE NOT EXISTS (
    SELECT 1 
    FROM Northwind..[Order Details] od 
    WHERE p.ProductId = od.ProductId)
Run Code Online (Sandbox Code Playgroud)

或者不是:

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE p.ProductID NOT IN (
    SELECT ProductID 
    FROM Northwind..[Order Details])
Run Code Online (Sandbox Code Playgroud)

查询执行计划表明他们都做同样的事情.如果是这种情况,这是推荐的形式?

这基于NorthWind数据库.

[编辑]

刚刚找到这篇有用的文章:http: //weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

我想我会坚持使用NOT EXISTS.

sql sql-server notin

507
推荐指数
9
解决办法
138万
查看次数

检查DBNull然后分配给变量的最有效方法是什么?

这个问题偶尔出现,但我没有看到一个满意的答案.

典型的模式是(row是DataRow):

 if (row["value"] != DBNull.Value)
 {
      someObject.Member = row["value"];
 }
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是哪个更有效率(我翻了条件):

  row["value"] == DBNull.Value; // Or
  row["value"] is DBNull; // Or
  row["value"].GetType() == typeof(DBNull) // Or... any suggestions?
Run Code Online (Sandbox Code Playgroud)

表明.GetType()应该更快,但编译器可能知道一些我不知道的技巧?

第二个问题,是否值得缓存row ["value"]的值,或者编译器是否优化了索引器?

例如:

  object valueHolder;
  if (DBNull.Value == (valueHolder = row["value"])) {}
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. row ["value"]存在.
  2. 我不知道列的列索引(因此列名称查找).
  3. 我具体要求检查DBNull然后分配(不是关于过早优化等).

我对几个场景进行了基准测试(时间以秒为单位,10,000,000次试验):

row["value"] == DBNull.Value: 00:00:01.5478995
row["value"] is DBNull: 00:00:01.6306578
row["value"].GetType() == typeof(DBNull): 00:00:02.0138757
Run Code Online (Sandbox Code Playgroud)

Object.ReferenceEquals与"=="具有相同的性能

最有趣的结果?如果您不匹配逐列的名称(例如,"值"而不是"值",则大约需要十倍的时间(对于字符串):

row["Value"] == DBNull.Value: 00:00:12.2792374
Run Code Online (Sandbox Code Playgroud)

故事的寓意似乎是,如果您无法通过索引查找列,请确保您提供给索引器的列名称与DataColumn的名称完全匹配.

缓存该值似乎也几乎快了两倍:

No Caching: 00:00:03.0996622
With Caching: 00:00:01.5659920
Run Code Online (Sandbox Code Playgroud)

所以最有效的方法 …

.net dbnull

150
推荐指数
9
解决办法
16万
查看次数

是vs typeof

这些代码中的哪一段更快?

if (obj is ClassA) {}

if (obj.GetType() == typeof(ClassA)) {}
Run Code Online (Sandbox Code Playgroud)

编辑:我知道他们不会做同样的事情.

c# rtti

145
推荐指数
4
解决办法
11万
查看次数

IDE用于Linux上的C#开发?

我有什么选择?我在一年多前尝试过MonoDevelop,但它非常错误.最新版本是一个稳定的开发环境吗?

c# linux ide mono

65
推荐指数
4
解决办法
9万
查看次数

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

是否有可能在C#中编写Quake的快速InvSqrt()函数?

这只是为了满足我自己的好奇心.

是否有这样的实现:

float InvSqrt (float x)
{
   float xhalf = 0.5f*x;
   int i = *(int*)&x;
   i = 0x5f3759df - (i>>1);
   x = *(float*)&i;
   x = x*(1.5f - xhalf*x*x);
   return x;
}
Run Code Online (Sandbox Code Playgroud)

在C#?如果存在,请发布代码.

我想我应该提到我正在寻找一个"安全"的实现......无论哪种方式,BitConverter代码解决了这个问题.工会的想法很有趣.我会测试它并发布我的结果.

编辑:正如预期的那样,不安全的方法是最快的,然后使用union(在函数内),然后是BitConverter.这些函数执行了10000000次,我使用System.Diagnostics.Stopwatch类进行计时.计算结果显示在括号中.

Input: 79.67
BitConverter Method: 00:00:01.2809018 (0.1120187)
Union Method: 00:00:00.6838758 (0.1120187)
Unsafe Method: 00:00:00.3376401 (0.1120187)
Run Code Online (Sandbox Code Playgroud)

为了完整性,我测试了内置的Math.Pow方法和"天真"方法(1/Sqrt(x)).

Math.Pow(x, -0.5): 00:00:01.7133228 (0.112034710535584)
1 / Math.Sqrt(x): 00:00:00.3757084 (0.1120347)
Run Code Online (Sandbox Code Playgroud)

1/Math.Sqrt()之间的差异是如此之小,以至于我认为不需要在C#(或任何其他不安全的方法)中使用不安全的快速InvSqrt()方法.除非真的需要从CPU中挤出最后一点果汁...... 1/Math.Sqrt()也更准确.

c#

30
推荐指数
3
解决办法
7011
查看次数

EM Dash#151之间的区别是什么?和#8212;?

我有一个包含EM Dash(或—HTML)的ASCII文件.十六进制值为0x97.当我们通过一个应用程序传递此文件时,它以UTF-8的形式到达,并将字符转换为0xC297,它是—HTML格式的.但是,当我们通过另一个应用程序传递此文件时,它将字符转换为0xE28094或—.

什么会导致这些应用程序以不同方式转换这些字符 它可能是代码页设置吗?

unicode ascii utf-8

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

你用什么来保护你的.NET代码免受逆向工程?

有一段时间我们使用了一个名为CodeVeil的工具.我只是想知道那里是否有更好的选择.

编辑:在更多人误解这个问题之前,我知道一个坚定的破解者可能会打败任何这些工具.我不是太在意他们.这些工具只是为了阻止"随意破解",并阻止人们窃取我们公司的IP.如果他们足够好,可以通过一个不错的工具,他们可能对窃取我们糟糕的代码不感兴趣:-P

.net obfuscation reflector

14
推荐指数
1
解决办法
6787
查看次数

"数据服务层"和"数据访问层"之间有什么区别?

我记得读过那个将低级调用抽象为数据无关框架(例如,ExecuteCommand方法等),而另一个通常包含业务特定方法(例如,UpdateCustomer).

它是否正确?哪个是哪个?

data-access-layer

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

Builder,Factory Method和Abstract Factory模式之间有什么区别?

程序接收消息列表(基本类型).列表中的每条消息都必须根据其类型(后代类型)进行处理.但是,不同的消息需要不同的输入才能正确处理.

下面介绍的技术是什么?(我没有在编译器中检查过这段代码)

abstract class MessageProcessor
{
    public static MessageProcessor GetProcessor(Message message, DataDomain data)
    {
        if (message.GetType() == typeof(FooMessage))
        {
            return new FooMessageProcessor(message, data.Name, data.Classification);

        }
        else if (message.GetType() == typeof(BarMessage))
        {
            return new BarMessageProcessor(message, data.AccountNo, data.CreditLimit);

        }
        else
            throw new SomeException("Unrecognized type");

    }

    public abstract void Process();     
}
Run Code Online (Sandbox Code Playgroud)

还有这个?

static class MessageProcessorFactory
{
    public static MessageProcessor GetProcessor(Message message, DataDomain data)
    {
        if (message.GetType() == typeof(FooMessage))
        {
            return new FooMessageProcessor(message, data.Name, data.Classification);

        }
        else if (message.GetType() == typeof(BarMessage))
        {
            return new …
Run Code Online (Sandbox Code Playgroud)

.net design-patterns

12
推荐指数
1
解决办法
4787
查看次数