La regola più importante è che è tutta la teoria fino a che il profilo. Io non tengo a quelli che insistono che l'analisi è tutto (senza qualche teoria non sei meglio di un Cultista merci mettendo noci di cocco sulle loro orecchie e in attesa del piano a venire), ma la sua teoria può essere sempre sbagliata o incompleta, così la profilazione è cruciale.
In genere, vogliamo che la scansione interna sia orizzontale (in termini di matrice, piuttosto che di immagine, sebbene per la maggior parte dei formati sia la stessa). Il motivo è che con una serie come:
00 01 02 03 04 05 06 07 08 09
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
Si sta per essere presentata come:
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
si vuole essere scansione lungo blocchi contigui che possono essere caricati in cache della CPU e poi utilizzati interamente, piuttosto che scansionare da blocco a blocco e dover cambiare regolarmente i contenuti della cache della CPU.
Questo è ancora più importante se si tenta di parallelizzare l'algoritmo. Si desidera che ogni filo trattare con i propri blocchi contigui di memoria per quanto sia all'ingresso che all'uscita va, piuttosto che non solo sofferenza modo singolo codice filettati fa con scarsa cache-hit-frequenza ma anche causando reciproche buffer da sporcate e ho bisogno di essere rinfrescante Questa può essere la differenza tra la parallelizzazione che porta ad un aumento di velocità e la parallelizzazione che effettivamente rallenta le cose.
Un'altra cosa è la differenza tra una matrice a 2 dimensioni byte[,]
piuttosto che un array di array byte[][]
, che il tuo commento in tua domanda "array [y] [x]" mi domando se forse si sta utilizzando. Con l'ex di ottenere arr [1,2] la logica è:
- Controlla Bounds
- posizione Calcolare (semplice aritmetica veloce)
- recuperare il valore.
Con quest'ultimo, la logica è:
- Vedi limiti
- ottenere matrice attraverso puntatore.
- Controlla i limiti
- recuperare il valore.
C'è anche meno memoria cache-hit-frequence. Quest'ultimo ha benefici quando sono necessarie strutture "frastagliate", ma non è questo il caso. Il 2D è quasi sempre più veloce dell'array di array.
cose che non mi vedono come probabile per aiutare, ma certamente li provare per l'utente:
Si può trovare una spinta da fare il vostro => logica 1d < 2d. Avere un array a dimensione singola dove idx = y * width + x. Non dovrebbe fare una differenza apprezzabile, ma vale la pena provare.
ottimizzazioni provano a entrambe le chiamate di sollevamento per .Length
e omettere limiti inutili controllo, in modo da possano trovare sollevamento manuale e il passaggio a l'aritmetica dei puntatori non guadagnare nulla, ma in un caso in cui si ha realmente bisogno di portare il tempo giù vale certamente la profilatura
Infine. Hai profilato la velocità con cui il tuo codice è in fase di scansione della matrice e non fare nulla? Potrebbe essere che un'altra parte del codice sia il vero collo di bottiglia, e tu stai aggiustando la cosa sbagliata.
Avrei dovuto dire che l'array è in realtà un BitmapData per l'assegnazione del colore bitmap:/sry ... –
Quindi, stai già bloccando la memoria? – Oded
Hai provato a codificare ogni soluzione e a misurare il tempo necessario? Questo ti darebbe la risposta più precisa. Ma se dovessi indovinare, direi che le opzioni 3 e 4 sono probabilmente leggermente più veloci delle opzioni 1 e 2. – aroth