C#はビルドするとCILっていう共通中間言語を生成する
これは人間にも読みやすいアセンブラっぽい物で実行時にVES(仮想実行システム)にCILを渡してJIT(実行時コンパイル)で必要な処理分がその都度機械語にコンパイルされ実行される
つまり毎回コンパイルは発生するけど動き始めれば機械語で動いてる

当然この方式に利点は合って同じソースでプラットフォームやマシン構成に合わせた最適な処理を生成してくれるので何も考えずに作ったC++より高速に動く事もある
また機械語に親和性の高い中間言語になっているので通常のコンパイルに比べたら格段に速く生成できる

明確にC#が遅い点は有って例えばメモリの確保宣言、これは仕方ない点もあってバグの温床になりやすいメモリの開放を自動でやってくれるガベージコレクションがある事
C#でも遅いけどその4~5倍ぐらいコストがかかる
ただ領域の確保は大差ないので大きなサイズになるほど相対的に変わらなくなる
つまりC#で小さい単位のメモリ確保と開放を繰り返すのはヤメレ
謎のメモリ保護エラーが発生する地獄を考えるとそのコストは払う価値がある