| ▲ | glouwbug an hour ago |
| True, but moving from a list of unique polymorphic pointers to a std::variant gains you at least a 2-3x speed up in terms of TLB and cacheline locality. From there, swapping to SOA will net you another 4-8x, so you're looking at nearly 25x improvement by going data first. That may not matter in the unique case of say, games, where rendering a million entities will dwarf the cost of SIMD processing a million entities, but in something like numerical simulations (fluids) or quant it will be warmly welcomed |
|
| ▲ | tcfhgj 38 minutes ago | parent | next [-] |
| are you sure? https://stackoverflow.com/questions/69444641/c17-stdvariant-... |
| |
| ▲ | creata 14 minutes ago | parent [-] | | If you take the linked benchmark and use the latest compiler version, the std::variant version is faster. The annoying thing about std::variant (and with some other features of modern C++) is that it generates a bunch of code that the compiler has to optimize away. |
|
|
| ▲ | cenamus an hour ago | parent | prev [-] |
| Is the improvement from using std:variant vs polymorphism just due to the indirection you save on? |
| |
| ▲ | glouwbug 35 minutes ago | parent [-] | | That, and it frees the compiler from reasoning about virtual inlining, and that the std::variant approach can pack potentially more than one object into a single cacheline. TLBs also work with 4096 byte pages, so 32 polymorphic 128 byte entities may (at the absolute worst case) use 32 distinct pages which requires 32 TLB virtual translations, while the std::variant one uses 1. The next step of going SOA benefits from all of the above, it just further unlocks you packed quad and oct instructions (AVX256 and 512 depending if you buy AMD or not). |
|