哪个查询更快?
不存在:
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.
这个问题偶尔出现,但我没有看到一个满意的答案.
典型的模式是(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)
笔记:
我对几个场景进行了基准测试(时间以秒为单位,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)
所以最有效的方法 …
这些代码中的哪一段更快?
if (obj is ClassA) {}
if (obj.GetType() == typeof(ClassA)) {}
Run Code Online (Sandbox Code Playgroud)
编辑:我知道他们不会做同样的事情.
我有什么选择?我在一年多前尝试过MonoDevelop,但它非常错误.最新版本是一个稳定的开发环境吗?
http://en.wikipedia.org/wiki/Diamond_problem
我知道这意味着什么,但我可以采取哪些措施来避免它?
这只是为了满足我自己的好奇心.
是否有这样的实现:
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()也更准确.
我有一个包含EM Dash(或—HTML)的ASCII文件.十六进制值为0x97.当我们通过一个应用程序传递此文件时,它以UTF-8的形式到达,并将字符转换为0xC297,它是—HTML格式的.但是,当我们通过另一个应用程序传递此文件时,它将字符转换为0xE28094或—.
什么会导致这些应用程序以不同方式转换这些字符 它可能是代码页设置吗?
有一段时间我们使用了一个名为CodeVeil的工具.我只是想知道那里是否有更好的选择.
编辑:在更多人误解这个问题之前,我知道一个坚定的破解者可能会打败任何这些工具.我不是太在意他们.这些工具只是为了阻止"随意破解",并阻止人们窃取我们公司的IP.如果他们足够好,可以通过一个不错的工具,他们可能对窃取我们糟糕的代码不感兴趣:-P
我记得读过那个将低级调用抽象为数据无关框架(例如,ExecuteCommand方法等),而另一个通常包含业务特定方法(例如,UpdateCustomer).
它是否正确?哪个是哪个?
程序接收消息列表(基本类型).列表中的每条消息都必须根据其类型(后代类型)进行处理.但是,不同的消息需要不同的输入才能正确处理.
下面介绍的技术是什么?(我没有在编译器中检查过这段代码)
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)