Native VS Managed

 
 表題の通り、「Nativeは速い」「VBは信頼性がない」果ては「VBでは商品価値がない」などと思い込んでいるプログラミングのプロたちがたくさんいます。

 上記の言葉は、すべて実際に私が複数の人から聞いた言葉ですから、実際にそう思い込んでいる人がたくさんいると言うことですね。

 つい最近でも、ロボットプログラムなどを書いている某工学博士が
  「Managedは遅くて話にならない」とまことしやかに言うので、
  「比較したことあるんですか?」と問い質してみると、
  「比較するまでもない」と仰るので、Native C と C# で早速試してみることに・・・

Native C

void Cvc_nativeDlg::OnBnClickedButton1()
{
  CString ss;
  CEdit * myED1 = (CEdit *)GetDlgItem(IDC_EDIT1);

  int i, j;
  double x;
  unsigned long ms;

  ms = timeGetTime();
  x = 0;
  for (i = 0; i < 100000; i++)
  {
    for (j = 0; j < 1000; j++)
    {
      x = x + sin(2.0 * i);
    }
  }

  ms = timeGetTime() -ms;
  ss.Format("Time = %d [ms], x=%lf", ms,x);

  myED1->SetWindowText(ss);
}

C#

private void button1_Click(object sender, EventArgs e)
{
  int i, j;
  double x;
  double ms;

  ms = QPF.GetMilliTime();
  x = 0;
  for (i = 0; i < 100000; i++)
  {
    for (j = 0; j < 1000; j++)
    {
      x = x + Math.Sin(2.0 * i);
    }
  }

  ms = QPF.GetMilliTime() - ms;
  textBox1.Text = ms.ToString("#,##0.000") + ":" + x.ToString();

}

 で、結果は、

Native C 70ms
C# 3,260ms

 うっそ~、惨敗じゃん、流石にNative コードは速いね。

 な~んて感心している場合じゃありません。 流石にネイティブ・コードに歩があるとしても、それほどまでに差が付く訳がありません。 コンパイル時に最高レベルの最適化を実施していると言うことなので、ソースをよく見てみると・・・

      x = x + sin(2.0 * i);

が、な~んか気に入りません。

 jループの中に、変数jが使用されていないので、

    x = x + sin(2.0 * i);
    for (j = 0; j < 1000; j++)
    {
    }

 と、コンパイルされる可能性が高いですね、jループなんてあってもなくても結果に影響がないからです。

 試しに、ソースを上のように書き換えて実行してみると、全く同じ処理時間となりました。

 そもそも、Native信者の某工学博士を納得させるためだったので、(私がコードを書いたのでは何か姑息なことでもしているんだろうと思われるかも知れないので)ソースは博士に任せたのですが、こんなこと書かれたんではね~。

 で、最適化で変なことにならないように、

    x = x + sin(2.0 * (i + j));

と直して再度挑戦!

Native C 4,299ms
C# 3,260ms

 C#が、だいたい 3/4 くらいの時間で処理が終わる結果となりました。 これが総てではありませんが、少なくとも Native 万能ではないことは解って貰えたようです。 この博士、個人攻撃をするつもりはないので最近テレビにちらっと映った某研究所の博士とだけ言っておきましょう。 テレビに映った彼の顔を見てこの一連の事件を思い出したのです。

 過去の経験から、○○博士とか言う人に限って専門分野以外では意外と何も解らない人が多いです。 専門外のことはそちらに詳しい人に任せておけば良いのに、そういう人に限って自分の専門外のことには何の価値をも見いださないので、聞く耳を持ちません。

 凄い人は凄いんだけどなぁ~。(2013/01/03)

 

※上記サンプルプログラムは、テスト目的だけのために書き下ろしたものであって、実際の運用に耐えうるものではありません。 コピペしてお持ち帰りになるのはご自由に、ですが流用した結果に対する責任はご自身で持って下さい。 しかも、元ソースは某工学博士が書いたものなので、更に責任は持てません。