Exists 比Contains 慢非常多。

void Main()
{
	List<string> s = new List<string>(){};
	for(int i=0;i<10000;i++)
	{
		s.Add(i.ToString());
	}

	s.Sort();

	Stopwatch sw0 = new Stopwatch();
	sw0.Start();
	for(int i=0;i<10000;i++)
	{
		var k0 =  s.Contains(i.ToString());
	}
	sw0.Stop();
	sw0.Elapsed.Dump();

	Stopwatch sw1 = new Stopwatch();
	sw1.Start();
	for(int i=0;i<10000;i++)
	{
		var k1 = s.Exists(it=>it==i.ToString());
	}
	sw1.Stop();
	sw1.Elapsed.Dump();

		Stopwatch sw2 = new Stopwatch();
	sw2.Start();
	for(int i=0;i<10000;i++)
	{
		var k2 = BinarySearch(s,i.ToString());
	}
	sw2.Stop();
	sw2.Elapsed.Dump();

}

public static bool BinarySearch(List<string> list, string value)

		{
			int min = 0;
			int max = list.Count;
			while (min < max)
			{
				int mid = (max + min) / 2;
				string midItem = list[mid];

				int comp = midItem.CompareTo(value);
				if (comp < 0)
				{
					min = mid + 1;
				}
				else if (comp > 0)
				{
					max = mid - 1;
				}
				else
				{
					return true;//midItem;
				}
			}
			if (min == max && min!=list.Count&&
				list[min].CompareTo(value) == 0)
			{
				return true;
			}

			return false;
		}

三个的执行时间。 拆半查找要求得要求先排序。

00:00:00.7093621

00:00:06.7513154

00:00:00.0159961

时间: 2024-11-05 02:20:44

Exists 比Contains 慢非常多。的相关文章

mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录

mysql not in.left join.IS NULL.NOT EXISTS 效率问题记录,需要的朋友可以参考下. NOT IN.JOIN.IS NULL.NOT EXISTS效率对比 语句一:select count(*) from A where A.a not in (select a from B) 语句二:select count(*) from A left join B on A.a = B.a where B.a is null 语句三:select count(*) fr

神奇的 SQL 之谓词 → 难理解的 EXISTS

前言 开心一刻 我要飞的更高,飞的更高,啊! 谓词 SQL 中的谓词指的是:返回值是逻辑值的函数.我们知道函数的返回值有可能是数字.字符串或者日期等等,但谓词的返回值全部是逻辑值(TRUE/FALSE/UNKNOW),谓词是一种特殊的函数.关于逻辑值,可以查看:神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL ! SQL 中的谓词有很多,如 =.>.<.<> 等,我们来看看 SQL 具体有哪些常用的谓词 比较谓词 创建表与初始化数据 -- 1.表创建并初始化数据 DROP

SQL中EXISTS的用法

比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢? EXIS

Redis EXISTS命令耗时过长case排查

一.背景 redis慢日志分析平台上线后,随便看了一下,发现onestore使用的缓存集群,存在大量的EXISTS命令慢查询的情况: 平均每个EXISTS命令需要13ms,最大耗时近20ms.这个结果很不科学啊,EXISTS命令只是执行一次hash查找操作,应该是us级别. 和相关同学了解业务背景如下: - 业务是userfeed,存放用户发表的动态 - 使用zset存储一个用户发表的所有动态,key是用户id,集合中对应的是feedid.如果用户发表的动态很多,zset也很大 - redis集

Git添加远程报错:remote origin already exists.

在本地创建了一个Git仓库,如何在Github创建一个Git仓库,并且让这两个仓库进行远程同步,这样Github上的仓库既可以作为备份仓库,还可以通过该仓库进行多人协作. 1.登录github,建立一个新的仓库 2.添加仓库名字 3根据Github的提示,在本地的learngit仓库下运行命令 1 $ git remote add origin [email protected]:zhanghuming/learngit.git 4.把本地库的所有内容推送到远程库上 1 $ git push -

浅谈sql中的in与not in,exists与not exists的区别

1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表大小相当,那么用in和exists差别不大:如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in: 例如:表A(小表),表B(大表) select * from A where cc in(select cc from B) -->效率低,用到了A表上cc列的索引:sele

github错误:fatal: remote origin already exists.

原文链接:http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果输入$ Git remote add origin [email protected]:djqiang(github帐号名)/gitdemo(项目名).git 提示出错信息:fatal: remote origin already exists. 解决办法如下: 1.先输入$ git remote rm origin 2.再输入$ git remote ad

SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. NOT IN.NOT EXISTS.LEFT JOIN...IS NULL性能分析 我们首先创建测试表 USE TSQL2012 GO CREATE SCHEMA [compare] CREATE TABLE [compare].t_left ( id INT NOT NULL PRIMARY KE

Python:关于os.path.isdir,os.path.exists,os.walk无法识别“~/&quot; HOME目录的问题。

在编写Python脚本的时候,我发现,os.path.isdir,os.path.exists,os.walk 根本无法识别 ‘~/‘ 表示的HOME目录.例如: Python 2.7.12 (default, Jul 18 2016, 10:55:51) [GCC 6.1.1 20160621 (Red Hat 6.1.1-3)] on linux2 Type "help", "copyright", "credits" or "li