少し間があきましたが、技術ネタで。
new/deleteは、C++はもとより、最近のプログラミング言語なら当たり前のようにやる(おっとdeleteはしないか)かと思いますが、そのコストについてはついつい忘れがちになります。
ADPは、C++で作成しているのですが、オブジェクトをリサイクルするように変更したところ、実行速度が倍ぐらいに速くなった。もともとは速くするために行った訳ではないのだが意外な副産物となった。
Visutal C++ではいつのころからか(遅くともVC++ 2003以降)、newすると最終的にはWindowsのAPIが呼び出される。パフォーマンスにシビアなシステムでは、ローカル変数の定義のようにお気楽に出来るものではないかもしれない。
といっても理屈だけではなんなので、具体的にどのくらいのコストがかかるかベンチマークしてみました。
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
class myobject {
int myvalue;
public:
myobject() : myvalue(0){};
};
myobject *myobjects[10*1000*1000];
int test(int v)
{
return v * 1000;
}
int main(void)
{
clock_t t = clock();
// new(1千万回)
t = clock();
for ( int i = 0; i < 10 * 1000 * 1000; i++ ) {
myobjects[i] = new myobject();
}
cout << "Time(new) is "
<< (double)(clock() - t) / CLOCKS_PER_SEC << "sec." << endl;
// delete(1千万回)
t = clock();
for ( int i = 0; i < 10 * 1000 * 1000; i++ ) {
delete myobjects[i];
}
cout << "Time(delete) is "
<< (double)(clock() - t) / CLOCKS_PER_SEC << "sec." << endl;
// 関数呼出し(1千万回)
t = clock();
for ( int i = 0; i < 10 * 1000 * 1000; i++ ) {
test(i);
}
cout << "Time(function call) is "
<< (double)(clock() - t) / CLOCKS_PER_SEC << "sec." << endl;
return 0;
}
以下、実行結果(Core i7-920 Windows7 コンパイルVC++2008 デバッグモード)
Time(new) is 2.065sec.
Time(delete) is 2.35sec.
Time(function call) is 0.26sec.
Windows環境でC++だと、おおむね1秒間に約数百万個のオブジェクトが作れるようです。また、関数呼び出しは数千万回できるようです。
上記の実行結果はデバッグ環境で行っていますので、リリースモードで実行するとこれから数倍速くなります。
この手の数字にピンとこない人の為に補足しますと、最近のコンピュータは1秒間に数十億個の命令が実行できます。単純に計算しますと、メモリの確保は約千個の命令を使っており、関数呼び出しは約百個の命令を使うということになります。
先週は、嫌なお客の話をしたので、今週は、もう一度ご一緒に仕事をしてみたいお客様の話をします。
そのお客さんは、とあるCEサイトを業者に作ってもらったのですが、残念ながらバグバグのシステムで大変不満を持たれていました。おりしも不況と重なって会社もリストラを始めたり、元々の担当者が止めたりで、新しく担当になった方は、業務は解るが、IT(WEBサイト)のことはよく知らないといった感じの人でした。色々不満もあったかと思いますが、そういったことは表に出さないで真面目にプロジェクトに取り組まれていました。
もっともITのことはあまり詳しくなかったので私が業者との交渉(バグの伝え方から、改修予算の値引き交渉やら、相手から来たメールの意図を翻訳したり)のサポートを行っていたました。
ただ、ECサイトによくあることですが、いかんせん売上が上がりませんでした。そういう中で次期開発の話が出てきたのですが、当然やりたいことにお金(予算、売り上げ)がついてこないので、そのギャップに担当者の方が悩んでいまして、ミーティングで愚痴を言われていました。そこで、思わず私が、
「今までの経験上、上手く行かないやり方を続けていてはダメになるばかりでっせ」
と言いました。
つまり、売上を上げていないのなら、無理に開発を進めるのではなく現行のシステムは修正にとどめたり、儲からないサービスやめたりするのも手ですよというある意味当然のことを言ったのですが、ただ、多くの日本人は『止める』という発想がなかなかできないようで、私も過去にこのようなことを言ってプロジェクトから外されたこともありました(本音を言ってくれてありがとうという人もいました)。
今回もこれは言い過ぎかなとも思ったのですが、この一言が担当者を救ったらしく、サービスメニューの構成を変えるように話しが進みました。以前なら『生意気なことを言うな』と言われるところだったのですが、平成不況も長くなると営業の現場の人もプライドを捨てて話をされるようになったようです。
その後、残念なことにやはり改修の規模が大きくなり、コストがかさむと同時にリストラが進み担当者もご勇退されプロジェクト自体が空中分解して、結局はそのECサイトはまったく改善をされずに閉鎖になりました。
私自身は営業的に失敗したプロジェクトをいくつも経験しているし僭越ながら自社のシステムを含めて成功しているプロジェクトも経験しているのですが、そのプロジェクトが終了したことは残念でした。もちろん予算がないプロジェクトだったので私自身もアドバイザーという形で週に1回しか打ち合わせに参加していなかったので、私のかかわり方として不完全燃焼な面もありました。
次回、その顧客と仕事をする機会があればぜひもっと良い結果を出せるように頑張りたいと思いました。
不況が長く続きますが、こういう難局を乗り越えるのもソフトウェアエンジニアというよりビジネスパーソンとして真価を問われていることだと思います。頑張りたいものです。
このブログにアクセスするOSのトップは WindowsXP でブラウザはIE6だったりします。
一応バリバリの技術系のブログなのであまり普通の人は見に来ないと思うのですが、今週も、約3割が、IE6からのアクセスになります。IE6っていまだに現役なのですね。
第2位ですが、OSはVista(含む7)で、ブラウザはfirefoxだったりすします。
(私のAnalogは、最新のOSとfirefoxのバージョンをカウントしていない・・・。)
最近では、MACが増えてきましたが、このページはMACは扱っていなのだが・・・。
意外なのが、いまだにWindows98とか、Windows95、たまにWindows3.1アクセスがあるのですが、
おそらくそれらはスパムだと思われる。
ADPはしばらくバイナリ(実行ファイル)の提供を行います。
パッケージ(インストーラやRPM等)は、そこまで開発を行う余裕がないというのもありますが、何より実行ファイルをコピーしたら使えるようにするというコンセプトで作っています。
Linuxのユーザにはちょっとお粗末な配布形式だと思われるかと思いますが、
MS-DOSからのユーザは昔からなじみのある配布形式かと思います。
公開するにあたって一番の悩みどころが
ソースコードをオープンにするかどうか?
というジレンマがあります。
本来ならオープンにすべきだと思うのですが以下の点からしばらくはソースコードは非公開しようかと思ってます。
- ソースが汚いので書き直す可能性が高い
- 一度公開すると非公開にできない。(逆は出来る)
- 言語仕様を出来るだけ文書化して開発したい。のでソースを公開することでお茶を濁したくない。
とまぁこんなところです。
ソースを公開しない欠点ですが、Linuxの対応になります。バイナリ配布すると各ディストリビューションの数だけそろえることになり、それは現実問題不可能なので当面は2,3のディストリビューションのみのリリースになります。
2010/08/03 追記
と言いつつ、
GPLで公開しました。