CompleteGetterはActiveBasic Ver2.6で作っています。C言語に比べて、Window管理とマルチスレッド管理がはるかに楽なのです。ただ
中間コード型なので、
実行コード型のC言語に比べると動作がずいぶんと遅いのが欠点。
そこで登場する「別の方法」とは、一番時間のかかるリンク走査部分を実行コード型であるActiveBasic Ver3.xで書いて、DLLとして呼び出すというもの。こうすれば、ぐっと早くなるはずなのです! ・・・ところが、実際にやってみると問題が2つ。
一つ目。Ver2.xとVer3.xではString型変数(C言語のStringクラスみたいなものです)のコンパイラ側での扱い方が違うみたいなんですが、そのせいでDLLを介してのString型配列が正常に渡せないことが発覚。プログラミング質問掲示板で聞いてみるも、どなた様も正確な理由はわからない模様。コンパイラ製作者本人が出てきてくれれば分かったかもしれないが、そこまで暇じゃなかろうし。
2つ目。Ver3.xで書いても、そこまで歴然とした速度差が出ない。たしかに若干は早くなるのだが。
そんなわけで諦めていたのだけれど。先日、とある方法を思いつく。
「C言語のChar型配列の概念に倣って、でっかいString型変数を1つを用意して、一定Byte数ずつ区切って、それぞれを配列要素扱いして渡せばいいんじゃねぇか?」
Char型でch[10,256]とか宣言すれば、256ByteずつのChar型文字列の配列10個、って扱えますよね? んでこれって実体は、配列0番要素はこの変数の開始アドレスから255Byte目まで、1番要素は256Byte目から511Byte目まで・・・ってなってましたよね? 同じことをString型に対して自力でやれば良いんでない?ってことですw で、やってみたら無事に成功しました♪ ポインタ万歳(笑)。
・・・実は、以前に聞いた質問掲示板でも、最後にとある方が問題の回避方法(正確に渡す方法)を提示してくれてました(^^;)。でもそれはHeapReAlloc関数使ってたので、私は「???」ってなって投げ出したんですねー(苦笑)。いえ、さっきHeapReAlloc調べて理解しましたけど。ちなみに、代入文字列あわせて各配列要素のByte数を変動させる、という賢いもの。使用メモリ数の節約ですね。それを除けば、やってることは今回私が考えたことを似たようなことでした。ちょっと嬉しいw やっぱこれが正しい解決法っぽい。
2つ目の問題に関しても少々進展が。先日追加した広告削除機能は、Htmlファイルから広告っぽい文字列を探して削除しているので、ようはリンク走査と似たようなことをやっているんですが
(リンクのほうが探す文字列パターン多いですけど)。これもVer3.xで書いてDLLとして呼び出してるんですが、リンク走査と同じ機構のはずなのに、動作がやたらめったら速い。・・・あれ? そんなに速度差は無いはずなのに。 と、ふと気付く。「もしかして、String型を使わずByte型(C言語のChar型に相当。以下Char型と書く)のみで扱っているからか?」 個人的推測ですが、Ver3.xでのString型ってコンパイラによる自動動的確保&開放のChar型文字列じゃなかろうかと。自動なのでコードを書く側からすると扱いは楽なのですが、一方で文字列の連結などの操作を行うたびに新たに確保しなおしてコピーして元の領域を開放、ってな作業がなされるだろうと思うのです。一般のChar型のように、あらかじめ必要な領域を確保しておいて、その中で操作が行われれば、その手間が省けるので、その分だけ動作が速くなっているのかもしれません。
これはぜひともChar型のみでコードを書いて高速化しなきゃ! ・・・が、これまでString型で書いていたので、全部書き直す必要が・・・それはヤリタクナイ(−_−) しかも、実際に書いてみないことには、本当にそんなに目に見えて高速化するのかが分からないという罠。散々苦労して書き直した末に「なんだ、結局変わらないじゃないか」では泣くぞ(>_<)
まぁ・・・結局そのうちやるんだろうなぁ┐(´ー`)┌