Wpis z mikrobloga

@pan_Dzik: wyjaśnienie: http://stackoverflow.com/questions/19138633/how-to-improve-speed-for-couting-a-biginteger-to-2256

The other numeric types in the .NET Framework are also immutable. However, because the BigInteger type has no upper or lower bounds, its values can grow extremely large and have a measurable impact on performance.

Although this process is transparent to the caller, it does incur a performance penalty. In some cases, especially when repeated operations are performed in a loop on very large BigInteger values, that performance
@fmfd: Bez zrównoleglenia i locka ten kod2 wykonywał się w ~970ms. Więc zdecydowanie wolniej niż przy pętli równoległej i locku.

Tak jak powiedział @EssePL to w znacznej części kwestia BigIntegerów bo gdy zamiast niego wstawiłem double to czas wykonania wynosił ~135ms (w kodzie 2, przy pętli równoległej i locku).

Ale ważniejszym powodem spowolnienia była ta linijka:
if (!results.Contains(powResult))
gdy usunąłem ją z kodu, a na końcu zamieniłem
Console.WriteLine(results.Count); na
Console.WriteLine(results.Distinct().Count());
to
@pan_Dzik: nie wiem jak jest w C# ale struktura danych nie przystosowana do wielowatkowego wywolania zawsze bedzie wolna. Plus tutaj masz liste a contains() pewnie przeglada liniowo na liscie. HashMapa bylaby optymalniejsza.