Ik heb een vector van tuples waarin ik wel of geen item heb. Met een simpele
Kom je er wel doorheen. Bij een gevonden voorwerp stopt het loopje. Alles prima. Nu heb ik een STL-manier gevonden om hetzelfde te doen, maar het is minder duidelijk dan de loop:
Ik heb een testje gemaakt, en in bijna alle omstandigheden is de STL-manier vele malen sneller.
~2x zo snel met real-life data (50 items) (~6000 ns vs ~12000 ns)
~5x zo snel met de "redelijk dekkend gevulde" data (400 items) (~12000 ns vs 62000 ns)
~7x zo snel met een exotischere hoeveelheid data (2000 items) (~42000 ns vs 310000 ns).
De testcode is hier. Gewoon in VS te compileren. Naampjes en types zijn vanuit het originele project geplukt.
Context:
Ik heb een map met afbeeldingen met namen van voertuigen. Deze namen hash ik en koppel ik aan een texture-ID, breedte en hoogte om op een later moment te kunnen laten zien. De functie met het opzoeken wordt gebruikt nadat een thread klaar is met het opzoeken van nieuwe/veranderde bestanden (afbeeldingen), dus wordt niet elke frame gebruikt. Wel gebruik ik soortgelijke vectors op andere plaatsen, dus waarschijnlijk schakel ik over naar std::find(_if).
Maar hoe komt het dus dat std::find_if zo verschrikkelijk snel is?
code:
1
2
3
4
5
6
7
| bool isPresentinAddonImages_loop(Hash hash) { for (auto addonImage : addonImages) { if (std::get<0>(addonImage) == hash) return true; } return false; } |
Kom je er wel doorheen. Bij een gevonden voorwerp stopt het loopje. Alles prima. Nu heb ik een STL-manier gevonden om hetzelfde te doen, maar het is minder duidelijk dan de loop:
code:
1
2
3
4
5
| bool isPresentinAddonImages_STL(Hash hash) { return addonImages.end() != std::find_if(addonImages.begin(), addonImages.end(), [&hash](const std::tuple<Hash, int, int, int>& element) { return std::get<0>(element) == hash; }); } |
Ik heb een testje gemaakt, en in bijna alle omstandigheden is de STL-manier vele malen sneller.
~2x zo snel met real-life data (50 items) (~6000 ns vs ~12000 ns)
~5x zo snel met de "redelijk dekkend gevulde" data (400 items) (~12000 ns vs 62000 ns)
~7x zo snel met een exotischere hoeveelheid data (2000 items) (~42000 ns vs 310000 ns).
De testcode is hier. Gewoon in VS te compileren. Naampjes en types zijn vanuit het originele project geplukt.
Context:
Ik heb een map met afbeeldingen met namen van voertuigen. Deze namen hash ik en koppel ik aan een texture-ID, breedte en hoogte om op een later moment te kunnen laten zien. De functie met het opzoeken wordt gebruikt nadat een thread klaar is met het opzoeken van nieuwe/veranderde bestanden (afbeeldingen), dus wordt niet elke frame gebruikt. Wel gebruik ik soortgelijke vectors op andere plaatsen, dus waarschijnlijk schakel ik over naar std::find(_if).
Maar hoe komt het dus dat std::find_if zo verschrikkelijk snel is?