ネタ元 → 例外に依存するロジックは駄目ですよ
ほほぉ、なかなかに興味深い実験でございます。
「このケースのように、事前に対象データの絞り込みは言語で
行うほうが良いケースもあります。」
SQLわからんちんの僕には胸のすく思い。
もちっと速くなるかもしんないなーってんでちょいと実験です。
using System;
using System.Collections.Generic;
using System.Diagnostics;
class Program {
static long AddUnique<T>(IEnumerable<T> src, ICollection<T> dst) {
Stopwatch watch = Stopwatch.StartNew();
foreach ( T item in src ) {
if ( !dst.Contains(item) ) { // 重複なければ
dst.Add(item); // 追加
}
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
public static void Main() {
int N = 100000; // 要素数
int M = 10000; // 値の上限
// 元ネタ生成
int[] src = new int[N];
var r = new Random();
for ( int i = 0; i < N; ++i )src[i] = r.Next(M);
// 3つのCollectionで比べてみよう
Console.WriteLine("LinkedList : {0}[ms]",AddUnique(src, new LinkedList<int>()));
Console.WriteLine("List : {0}[ms]",AddUnique(src, new List<int>()));
Console.WriteLine("HashSet : {0}[ms]",AddUnique(src, new HashSet<int>()));
}
}
実行結果:
LinkedList : 4729[ms]
List : 3503[ms]
HashSet : 17[ms]
Hashすげー。