In version 10.1 timings are pretty much as I expected:
f1[x_Integer] := x;
f2[x_] := x /; x ∈ Integers;
f3[x_?IntegerQ] := x;
First @ Timing @ Do[#[i], {i, 1*^6}] & /@ {f1, f2, f3}
{0.374402, 1.06081, 0.499203}
As m_goldberg commented _Integer should be fastest as unlike the others it does not require evaluation; it directly matches the ("implicit") head of the argument. This difference becomes more important with functions that hold their arguments.
SetAttributes[{f1, f2, f3}, HoldAll]
foo := Print["pop!"]
With f1 the Print does not evaluate:
f1[foo]; (* nothing printed *)
With f2 and f2 it does:
f2[foo];
f3[foo];
pop!
pop!
That also results in this evaluation behavior:
z = 1;
f1[z]
f2[z]
f3[z]
f1[z]
1
1
f1 matches only an explicit integer and z is not but since f2 and f3 evaluate their arguments in the course of pattern matching the assigned value of z is used, matched, and returned.
Traceon each, s/b/ illuminating... – ciao May 18 '15 at 21:08[x_Integer] := xwere not the fastest of the examples you give, for the simple reason that it requires the least effort to determine whether the actual argument passed matches the argument pattern. – m_goldberg May 18 '15 at 22:39