C/C++でパフォーマンスが重要なものを書くのが、全体的に見て少ない労力で済むんじゃないかって、最近よく考えるんだよね。パフォーマンス重視のゼロアロケーションのC#とC/C++は、裏技みたいなもので、言語としてのサポートが全然違う。ボクシンググローブと外科用手袋みたいな感じ。C#でもできるけど、いろんな抽象化があってさ。特別なパフォーマンスAPI、C#、IL、アセンブリ。結果は言語のバージョンやランタイムのバージョン、プラットフォーム、IL2CPP/Burst/Mono/dotnetによって変わるけど、C/C++はコンパイラという一つの抽象化レイヤーだけで、コンパイルしたらそれが固定される。できるだけ正確に、一貫して、シンプルな方法でやりたいんだよね! .cppと.csを一緒にコンパイルするビルド環境があれば、すごく助かるな。 ---- 抽象化についての例として、こんなのがある。
void addBatch(int *a, int *b, int count) { for(int i=0; i < count; i++) { a[i] += b[i]; } }
対して、
[MethodImpl(MethodImplOptions.AggressiveOptimization)] public static void AddBatch(int[] a, int[] b, int count) { ref int ra = ref MemoryMarshal.GetArrayDataReference(a); ref int rb = ref MemoryMarshal.GetArrayDataReference(b); for (nint i = 0, n = (nint)count; i < n; i++) { ra[i] += rb[i]; } }
(これは明らかに作り話の例だけど、抽象化の種類を示したかったんだ。)