Dus*_*sty 8 c# dictionary try-catch containskey
我有一个Vector2的生成列表我必须检查一个字典,看看它们是否存在,这个函数每次滴答都会被执行.
这样做会跑得最快/做得更好?
public static bool exists(Vector2 Position, Dictionary<Vector2, object> ToCheck)
{
try
{
object Test = ToCheck[Position];
return (true);
}
catch
{
return (false);
}
}
Run Code Online (Sandbox Code Playgroud)
或者我应该坚持常态?
public static bool exists(Vector2 Position, Dictionary<Vector2, object> ToCheck)
{
if (ToCheck.ContainsKey(Position))
{
return (true);
}
return (false);
}
Run Code Online (Sandbox Code Playgroud)
谢谢你输入:)
旁注:(此时密钥的值无关紧要,或者我将使用TryGetValue而不是ContainsKey)
小智 24
我知道这是一个老问题,但只是添加一些经验数据......
在包含10,000个条目的字典上运行50,000,000个查找并比较完成的相对时间:
..如果每次查找都成功:
..如果每10,000个观察中有1个失败:
..如果每10,000个观察中有16个失败:
..如果每10,000个查找中有250个失败:
..因此,一个有保障的测试将增加一个不变的开销,并且如果它永远不会失败,那么try-catch测试的运行速度几乎与没有测试一样快,但是会在失败次数上按比例杀死性能.
我用来运行测试的代码:
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{ Test(0);
Test(1);
Test(16);
Test(250);
}
private static void Test(int failsPerSet)
{ Dictionary<int, bool> items = new Dictionary<int,bool>();
for(int i = 0; i < 10000; i++)
if(i >= failsPerSet)
items[i] = true;
if(failsPerSet == 0)
RawLookup(items, failsPerSet);
GuardedLookup(items, failsPerSet);
CaughtLookup(items, failsPerSet);
}
private static void RawLookup
( Dictionary<int, bool> items
, int failsPerSet
){ int found = 0;
DateTime start ;
Console.Write("Raw (");
Console.Write(failsPerSet);
Console.Write("): ");
start = DateTime.Now;
for(int i = 0; i < 50000000; i++)
{ int pick = i % 10000;
if(items[pick])
found++;
}
Console.WriteLine(DateTime.Now - start);
}
private static void GuardedLookup
( Dictionary<int, bool> items
, int failsPerSet
){ int found = 0;
DateTime start ;
Console.Write("Guarded (");
Console.Write(failsPerSet);
Console.Write("): ");
start = DateTime.Now;
for(int i = 0; i < 50000000; i++)
{ int pick = i % 10000;
if(items.ContainsKey(pick))
if(items[pick])
found++;
}
Console.WriteLine(DateTime.Now - start);
}
private static void CaughtLookup
( Dictionary<int, bool> items
, int failsPerSet
){ int found = 0;
DateTime start ;
Console.Write("Caught (");
Console.Write(failsPerSet);
Console.Write("): ");
start = DateTime.Now;
for(int i = 0; i < 50000000; i++)
{ int pick = i % 10000;
try
{ if(items[pick])
found++;
}
catch
{
}
}
Console.WriteLine(DateTime.Now - start);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3318 次 |
| 最近记录: |