// variant_test.cpp #include #include #include #include struct Metal { float data[4]; void render() const { asm volatile("" ::: "memory"); } }; struct Lambertian { float data[4]; void render() const { asm volatile("" ::: "memory"); } }; struct Plastic { float data[4]; void render() const { asm volatile("" ::: "memory"); } }; struct Glass { float data[4]; void render() const { asm volatile("" ::: "memory"); } }; using Material = std::variant; void visitMaterial(Material& mat) { std::visit([](auto& m) { m.render(); }, mat); } int main() { const size_t count = 400000; std::vector materials(count); for (size_t i = 0; i < count; ++i) { switch (i % 4) { case 0: materials[i] = Metal{{static_cast(i), 0, 0, 0}}; break; case 1: materials[i] = Lambertian{{static_cast(i), 0, 0, 0}}; break; case 2: materials[i] = Plastic{{static_cast(i), 0, 0, 0}}; break; case 3: materials[i] = Glass{{static_cast(i), 0, 0, 0}}; break; } } auto start_time = std::chrono::high_resolution_clock::now(); for (auto& mat : materials) { visitMaterial(mat); } auto end_time = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(end_time - start_time); std::cout << "std::variant Execution Time: " << duration.count() << " µs\n"; return 0; }