Threads - przestaje to rozumieć

0

Witajcie.

Ponieważ dalej walczę z klasą Thread, doszesłem do pewnych niezrozumiałych dla mnie wniosków.

Mam tablica, np:

object [,] tablica = new object [30000, 1000];

i teraz kiedy wypełniam ją pętlą danymi:

int intX = tablica.GetUpperBound(0)+1;
int intY = tablica.GetUpperBound(1)+1;
for (int iP = 0; iP< intY; iP++)
{
 for (int iP2 = 0; iP2 < intX; iP2++)
 {
 tablica[iP2, iP] = iP2.ToString() + "/" + iP.ToString();
 }
}

mojemu komputerowi zajmuje to ok 54 sekundy.

Kiedy robię to samo puszczając 5 wątków, z których każdy wykonuję jedną metodę z parametrem (w tablicy parametrów inicjuję najpierw indeks, od którego ma wątek rozpocząć wpisywanie do tablicy oraz ilość wierszy):

                         int[,] parametry = new int[5, 2];

		private void ThreadTest2(object param1)
		{
			int indeksP = (int)param1;

			int idKolumny = parametry[indeksP, 0];
			int ilosc = parametry[indeksP, 1];

			int intPX = tablica.GetUpperBound(0) + 1;

			for (int ipk = idKolumny; ipk < idKolumny + ilosc; ipk++)
			{
				for (int ip = 0; ip < intPX; ip++)
				{
					tablica[ip, ipk] = ip.ToString() + "/" + ipk.ToString();
				}
			}
		}

Myślałem, że puszczając wypłnianie w 5 wątkach na raz zyskam na czasie, a okazuje się, że nie.
Początkowo myślałem, że to z powodu tego, że wszystkie wątki używają jednaj globalnej statycznej tablicy, ale, gdy nakazałem im wypełniać swoje tablice, efekt jest taki sam.
Jak przyspieszyć zatem wypełnianie ogromnej tablicy wątkami?

0
dex80 napisał(a)

Myślałem, że puszczając wypłnianie w 5 wątkach na raz zyskam na czasie, a okazuje się, że nie.

Ile masz rdzeni?

0

Na lapie gdzie pisze mam 2, a na serwerku mam 8 ;)

D.

0

to jeszcze pokaz jak odpalasz watki

0

Najwięcej czasu potrzeba na
tablica[ip, ipk] = ip.ToString() + "/" + ipk.ToString();

i nie chodzi o samo przypisanie, a o "ip.ToString() + "/" + ipk.ToString()".

Nie chodzi tu też o CPU, a o RAM. Twój program "wisi" na operacjach na pamięci, których nie można zrównoleglić (alokacja pamięci, kopiowanie pamięci przy łączeni napisów).
Poczytaj o metodzie string.Format

0

Faktycznie string.Format to w ogóle dobry pomysł, ale zastanawiam się nie tylko nad tym. Skoro mam wewnątrz wątku wywołania do SQLa i z niego pobieram w oddzielnych połączeniach dane, to jakby nie patrzeć, wszystko dzieje się w pamięci, więc skoro pamięć będzie wąskim kardłem, to czy w ogóle można pobierać np. w 5 wątkach dane do tablic niezależnie od siebie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1