Ich entwickle Bildverarbeitungsalgorithmen (mit GCC, Targeting ARMv7 (Raspberry Pi 2B)).Schnelles Suchen/Ersetzen von übereinstimmenden einzelnen Bytes in einem 8-Bit-Array, auf ARM
Insbesondere verwende ich einen einfachen Algorithmus, der Index in einer Maske ändert:
void ChangeIndex(uint8_t * mask, size_t size, uint8_t oldIndex, uint8_t newIndex)
{
for(size_t i = 0; i < size; ++i)
{
if(mask[i] == oldIndex)
mask[i] = newIndex;
}
}
Leider für die Zielplattform hat schlechte Leistung.
Gibt es eine Möglichkeit, es zu optimieren?
nicht sofort ersichtlich, wie man die schneller - es Tricks sein, wenn Sie mehr über die Daten wissen - zum Beispiel, könnten Sie eine Liste von Zellen enthalten, Wert 'X' - aber das ist nur dann nützlich, wenn die Anzahl der" Hits "ziemlich niedrig ist - wenn Sie die meisten Einträge in' mask' mit 'oldIndex' treffen, ist es unwahrscheinlich, dass sie schneller werden. Welchen Wert hat "Größe" und wie viele Prozent der Tabelle hat im Durchschnitt den Wert "oldIndex"? –
Welche Compiler-Optionen verwenden Sie? Stellen Sie sicher, dass Sie es angewiesen haben, NEON-Anweisungen zu verwenden ('-mfpu = neon-vfpv4', denke ich), andernfalls erzeugt es Code, der mit älteren CPUs kompatibel ist, die keinen NEON haben. – Gilles
Sie sollten auch eine Beschleunigung mit dem ternären Operator bekommen: 'mask [i] = (mask [i] == oldIndex)? newIndex: mask [i]; ' – Miki