2009-06-20 13 views
39

私はいつもオリジナルのuTorrentプログラムを賞賛してきました。それは素晴らしく、64kb以下であり、非常に高速で、必要な機能をすべて備えていました。残念ながら、プログラムはクローズソースであり、その日までにはもっと肥大化しているので、私はインスピレーションのためにStackoverflowに来る。スリムなC++プログラム(uTorrentなど)をWindows用にプログラミング

Windows上で高速でメモリ効率の良い優雅なプログラムを書くにはどのような方法をお勧めしますか?

C#(と.NETのコンセプト全体)はクールなアイデアですが、オリジナルのuTorrentクライアントのように、Windowsプラットフォーム用の効率的で高速なソフトウェアを作成するという「純粋な」回答と課題にもっと興味があります。私は自分自身のメモリを割り当てること、私自身のガベージコレクションをすること、自分のデータ構造を作ることは気にしません。

私のシステムにもっとカフェインを摂取するための書籍、記事、図書館、IDEに関する推奨事項(歓迎)

+1

笑、カフェインの部分が私を笑わせてくれました。まあ、私は答えはないと思っていますが、ハードコアの純粋主義者たちが組立に向かうことは知っていますが、組立の際に奔流のクライアントほど複雑なものをプログラミングするのは不可能なことでしょう。私はあなたが自分のコードを書いていれば(ライブラリを使わずに)、64kb以下のC/C++プログラムを簡単に手に入れることができると思います。あなたがアセンブリで書いたのであれば、おそらく1kb以下でそれを取り除くことができます。 – ldog

+0

AFAIK uTorrentはコンプレッサーを搭載しているため、物理的なサイズが小さいです。しかし、実行時には圧縮解除され、より多くのメモリを使用します。小さな実行可能ファイルのサイズは、多くのライブラリ、特にC++の標準ライブラリとストリーム機能の使用を避け、プログラム専用に作成された代替ファイルを作成することによって実現されます。 (ウィキペディアの記事を参照してください) – Vanuan

+0

Vanuan: "はるかに多くのメモリ"は少しのストレッチです。実行可能なパッカーは通常、最大50%の圧縮率を達成します。したがって、μTorrentをメモリに展開して実行するには、これを実行するには約500 KiBが必要です。今日のマシンではほとんど役に立たない。 – Joey

答えて

17

Windowsテンプレートライブラリは、あなたがやりたいことに対応しています。これは、Win32 API用の軽量のテンプレートベースのC++ラッパーです。これにより、Win32の直接的なコーディングの苦痛を経験する必要はありませんが、MFCのようなオーバーヘッドが増えることはありません。

8

最小限のメモリ占有量を最適化し、.NET CLRがあなたのために開発した一連のフープを飛び越えて、直接Win32APIアプリケーションを作成してGDI+は行く方法です。 Petzoldが決定的な基準となりました。

あなたのアプリがそれを使用するかどうかに関係なく、.NETランタイムがOSのメモリにロードされるので、それはまったくの間違いです。

+0

.NETフレームワークは、DLLの他のコレクションと同じ方法で、すべてのプロセスに個別に読み込まれます。またはこれは最近変更されましたか? –

+8

@Pontus Gagge:あなたの理解は間違っています。 Windowsの背後からDLLの全体のアイデア3。x日は同じコードを複数回メモリにロードすることを避けることでした。 Win16とWin32は、プロセス間でDLLコードを共有しています(ただし、異なるメカニズムを使用しています)。 DLLは仮想メモリの魔法によって各プロセスアドレス空間に現れますが、実際にはDLLコードのインスタンスは1つだけメモリに存在します。 –

+1

.NETでは、自動メモリ管理のためにメモリオーバーヘッドが発生します。また、何かを(ゆっくりと)描画しない限り、なぜGDI +を使用しますか? – Joey

5

一般:より小さい実行可能ファイルの場合、#define WIN32_LEAN_AND_MEANとVC_EXTRALEAN(VSと仮定)。デバッグシンボルでコンパイルしないでください(これはおそらく分かります)。使用するライブラリの数を減らし、必要なライブラリの部分だけをリンクするようにしてください(VCのリンカはこれについてかなり良いですが、助けてくれればoptlinkに触れないでください)。

再配置ヘッダーを削除する:http://www.paehl.de/cms/oldtoolsに移動し、「ReduceEXE」(直接ダウンロードリンク:http://www.paehl.de/reduce.zip)を検索します。

実行可能なパッカーを実行してください:http://upx.sourceforge.net/ ...実行時により多くのメモリを使い果たして少し遅くなりますが、ファイルはかなり小さくなります。

速度よりもファイルサイズが重い場合、VCには「サイズを最適化する」というオプションがあり、ループアンローリングや関数インリングなどの機能が無効になります。

ハードコアになりたい場合(ソフトウェアエンジニアリングのメリットについては気にしないでください)、仮想関数を使用しないPOSタイプよりも少ないクラスを使用してみてください。ウィキペディアは、プログラムの実行時間の6〜13%が仮想呼び出しを行うのに費やされることを示唆しています。さらに、vtable自体が(リトル)メモリを占有し、vtableポインタのために(仮想関数を持つ)すべてのクラスインスタンスの先頭にあるsize_t分のメモリが割り当てられます。 IOW、 "純粋なC"はわずかに速くなります(ただし、関数ポインタでクラスをエミュレートしているのであれば、C++に戻ってしまいます)。

+0

"デバッグシンボルでコンパイルしない" - デバッグシンボルは外部PDBファイルで作成されます。リリースビルドでもそれらを生成しない理由は絶対にありません(http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/06/19/do-pdb-files-affect-performance.aspxを参照) "速度よりもファイルサイズが重視される場合、VCには「サイズを最適化する」オプションがあります。実際にはスピード性能に変わります。サイズが小さくなるほどキャッシュミスやページフォールトが少なくなります。 –

+3

@フロイント - 必ずしもそうではありません - 彼は特にVC++について言及しませんでした。 VCはデバッグ情報をPDBとして実装しますが、DMCやMinGW GCCなどでコンパイルすると、デバッグ情報がオブジェクトファイルに含まれます。 –

7

Demo Sceneは、楽しい時間を過ごして、印象的で非常に小さな実行ファイルを作成しようとする人のグループです。通常は、3Dで何かを音楽にレンダリングします。多くのデモ(コード、音楽、3Dデータ)は、1つの実行可能ファイルにコンパイルされ、64 KBに圧縮されているか、コンテンツのサイズが非常に小さいです。

デモからインスピレーションを引き出し、作成方法について学習することで、小さな実行可能ファイルを作成するというあなたの強迫観念を伝えることができます。

多くの場合、WindowsにインストールされているサードパーティのDLLをできるだけ多く利用することが重要です。また、低レベルのカスタムコーディングが必要です。

10

uTorrentはC++で書かれており、旧式のWin32 APIを使用しています。 Google Chromeもこのように書かれているので、ソースコードをダウンロードしてコードから学ぶのはなぜですか?

+1

はい私はあなたに同意します。 Win32 APIを学び、小さくて速いアプリケーションを作成することができます。 私はDelphiを使用していましたが、小さなアプリケーションを作成して覚えやすく(パスカル言語) – nightingale2k1

+0

+1 for Pascal;) –

1

Notepad++ は、非常に高速で高度に最適化された非常に便利なプログラムで、インスピレーションを呼び起こすことができます。それは哲学はuTorrentのそれに似ています。 これはWindows上で に行くことができる最速のWin32 apiを使用しています。

あなたが本当に芸術に行きたい場合は、デモシーンは に行くのに最適な場所です。彼らのコードは常に開いているとは限りません。

+1

"Notepad ++は非常に高速で高度に最適化されています" 。時には大きなファイルでは十分に遅いです。そして最後のリリースはバグだった。別のライトと高速エディタはAkelPad - http://akelpad.sf.net/です(パッケージ化されたexeでは〜100k、パックされたプラグインでは〜250Kです) – zxcat

5

古い"LIBCTiny"トリックはまだ動作します。現代のVC++リリースでは、いくつかの機能を切り替える必要があります。

もう1つの良いトリックは、Kernel32のlstr*関数のコレクションです。それはすでに記憶に残っているので、それらの機能はより希薄な選択かもしれません。

関連する問題