Czemu zrobienie czegoś trwa dłużej, jeżeli robie to inną metodą?

Odpowiedz Nowy wątek
2011-07-21 09:50
0

Trochę dziwny temat, ale chodzi np o to że jak zrobię tak

Image1.Picture.Bitmap := MojaBitmapa;

Od razu wyświetli się MojaBitmapa, natomiast jeżeli zrobie tak

for I := 0 to MojaBitmapa.Height - 1do
  for J := 0 to MojaBitmapa.Width - 1 do
    Image1.Picture.Bitmap.Canvas.Pixels[I, J] :=MojaBitmapa.Canvas.Pixels[I, J];

To potrwa to znacznie dłużej.
Czemu tak się dzieje??


char mander; bool basaur;
edytowany 3x, ostatnio: madmike, 2011-07-25 14:48

Pozostało 580 znaków

2011-07-21 10:04
0
  1. Dostęp do obrazka poprzez .Canvas.Pixels[I, J] jest powolny
  2. zwykłe przypisanie Image1.Picture.Bitmap := MojaBitmapa; nie musi oznaczać, że jest robiona kopia tego obrazka (najprawdopodobniej jest wykonywana płytka kopia).
  3. nawet jeśli Image1.Picture.Bitmap := MojaBitmapa; robi pełną kopie obrazka, to kopia ta wykonana jest prze optymalne odwołanie się do pamięci.
  4. poszukaj czegoś takiego jak scanLine

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2011-07-21 11:56
0

za takie coś

Image1.Picture.Bitmap := MojaBitmapa;

powinni ucinać łapska przy samej dupie. To NICZEGO nie kopiuje to jedynie przypisuje WSKAŹNIK MojaBitmapa do Image1.Picture.Bitmap. Prawidłowo powinno być

Image1.Picture.Bitmap.Assign(MojaBitmapa);

Resztę opisał Ci już Marek


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-07-21 14:24
0

powinni ucinać łapska przy samej dupie
a bo ponieważ? czasami jest to najlepsze i najszybsze rozwiązanie, pod warunkiem że się wie co się robi.

Pozostało 580 znaków

2011-07-21 18:47
0
Misiekd napisał(a)

za takie coś

Image1.Picture.Bitmap := MojaBitmapa;

Tym razem się mylisz, zobacz w źródełkach co to robi. Ba, jest bezpieczniejsze niż Image1.Picture.Bitmap.Assign(MojaBitmapa);


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon, 2011-07-21 18:48
tu macie rację - mój błąd - Misiekd 2011-07-22 02:57

Pozostało 580 znaków

2011-07-22 01:45
0

A mi się że chodzi bardziej generalnie.

Gdyby naraz skopiować cały obiekt, to wysyłamy jedno żądanie do OS, i wszystko wykonuje się na najniższym poziomie, gdy mamy FOR, to kompilator przy każdym powtórzeniu pętli musi wyliczyć gdzie w pamięci jest dany indeks tablicy, potem z niego pobrać dane (tylko jeden piksel) i go zapisać gdzie indziej.

Jeszcze od siebie dodam, że z moich badań wynika, że dużo szybsze niż używanie

for i:=0 to length(tab)-1 do foo(tab[i]);

jest

p:[email protected][0];
for i:=0 to length(tab)-1 do
  begin
  foo(p^);
  inc(p);
  end;

Różnica jest naprawde widoczna w przypadku dużych tablic i podwójnych pętli for.


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
ciekawe - jeśli jest znaczna różnica, to znaczy że kompilator daje ciała, generując nieoptymalny kod. - Azarien 2011-07-22 08:04
Jeżeli napiszesz kompilator z idealną optymalizacją to daj znać :-] . W każdym razie tak było, z tego co pamiętam to pewnie dałem -O3 zanim brałem się za ręczną optymilizację. :P - payl 2011-07-22 17:42

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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