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.
Ogólnie chodzi o to ze dostep jednowatkowy i wielowatkowy roznia sie od siebie - po pierwsze trzeba zapewnic poprawnosc operacji a po drugie mozna zoptymalizowac strukture pod katem wykorzystania wielu core'ow - w obu przypadkach to rozne implementacje z roznymi implikacjami.
1. http://pastebin.com/HTvfqTnr
2. http://pastebin.com/aAZxXk7s
Przez BigIntegery?
#programowanie #csharp
Komentarz usunięty przez autora
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
Ogólnie chodzi o to ze dostep jednowatkowy i wielowatkowy roznia sie od siebie - po pierwsze trzeba zapewnic poprawnosc operacji a po drugie mozna zoptymalizowac strukture pod katem wykorzystania wielu core'ow - w obu przypadkach to rozne implementacje z roznymi implikacjami.