■スレッドリストへ戻る■ 全部 1- 101- 201- 301- 401- 501- 601- 701- 801- 901- 最新50

プログラマが2chを救う!?

511 :ナナシサソ :01/08/26 14:21
splitterは要素ごとに関数を分けて、本文はケツから探索
日付はある程度固定長だからそれをもとに探索
ってやるのはどうよ?

512 :ナナシサソ :01/08/26 14:23
レスの開始点の情報を持つテーブルはあるんでしょ。
インターフェースを大幅に変えなきゃならんのかな?

513 :デフォルトの名無しさん :01/08/26 14:24
>505
それ旧タイプね。今は全部新タイプ(TYPE_TERI)だったと思う。
TYPE_TERIのfindSplitter内はほとんど改良の余地はない。
コードをうまく書くかインラインアセンブラでCMPS(x86と仮定して)を
使うようにすることぐらいかな?

514 :名無しさん@ミポリソ@UNIX板 :01/08/26 14:25
>>497-498
ご苦労さん とりあえず負荷が大きいのはdat_read()とfindSplitter()と考えていいのか...

dat_read() -> mmap()を使う
findSplitter() -> if (*p >= 0xa0 && *p <= 0xdf) {p++; continue;} がムダ

ってとこかな とりあえず...... しかし全面的に改めた方がって気も

515 :デフォルトの名無しさん :01/08/26 14:28
とりあえず、gmtime()の重複をなんとかしないといけないから、
//先頭のほう
- struct tm *tm_now;
+ struct tm tm_now;
//zz_GetEnv()
- tm_now = gmtime(&t_now);
+ tm_now = *gmtime(&t_now);
あと、
html_error999()とlogOut()とIsBusy2ch()の
tm_now->をtm_now.に直すべ。

実際には、IsBusy2ch()しか呼ばれてないから、
tm_nowの代入はそこでも良いかもしれない(コンパイルエラーだけど)。

516 :デフォルトの名無しさん :01/08/26 14:29
UNIX知らなくてごめん。
mmap()って、排他制御はどうなってるん?

あ、でも読みこみだけだから大丈夫なのかな?

517 :デフォルトの名無しさん :01/08/26 14:34
gmtime()は... from http://cocoa.2ch.net/test/read.cgi?bbs=unix&key=998764722&st=447&to=450&nofirst=true

447 名前:名無しさん@お腹いっぱい。 投稿日:01/08/26 12:52
   .htaccessに
     SetEnv TZ "JST-9"
   って書いとくか コード中で
     putenv("TZ=JST-9"); tzset();
   ってしとけばlocaltime()使うのもありかと
   むしろ 9*60*60 のハードコーディングはコードの見通しが悪くなるような

450 名前:447 投稿日:01/08/26 12:58
   つうかオススメは
     gmtime_r(), localtime_r()
   なんだけどね

518 :514 :01/08/26 14:58
>>516 するんならmlock()か...

あとfindSplitter()のssも unsigned char にした方が何気によさげかも

519 :デフォルトの名無しさん :01/08/26 15:09
>514
>findSplitter() -> if (*p >= 0xa0 && *p <= 0xdf) {p++; continue;} がムダ
テーブルすべきだろうけど、そもそも、そのコードはTYPE_TERIの時
はコメントアウトされてるので関係ないです

>516
>mmap()って、排他制御はどうなってるん?
ない。他プロセスがファイルを書き換えると、mmapで得られたバッファの中身も同時に
書き換わる。
>518
mlockって、メモリブロックがページアウトされないようにロックするだけで、
書き換え不可ってできたっけ?

520 :497 :01/08/26 15:10
環境書き忘れたけど read11.c を RedHat6.2/gcc2.91.66 でコンパイルしてます。
コンパイルオプションは -pg -DLASTMOD -DGZIP で、read2ch.h内で TYPE_TERI, Katjusha_Beta_kisei をdefine済み。

で、dat_read() が遅いのは実際のI/Oではなくて
壊れたDATファイルへの対処と思われる
for(i=0;i<zz_fileSize;i++)
{
if(BigBuffer[i] == '\0')BigBuffer[i] = '*';
}
この部分が大半の時間を食ってる。

findSplitterに関しては、、DATファイルの先頭のエレメントは固定長区切りに
するとかしないとどうにもならんかもね。インライン展開してもあんまり芳しくなかった。

521 :デフォルトの名無しさん :01/08/26 15:22
全般的に\0終端文字列ではなく、長さを別に保持したほうが
良いように思う。
現状だと、BigBufferのデータをgetLineMaxで行単位に、res_splitでフィールド単位に
\0終端させてるが、そのたびに、BigBufferの全スキャンになるので、
一括で、行とフィールドに分割したほうが良いように思う。

522 :VB厨房 :01/08/26 15:25
曜日必要だぞゴルァ。あれも立派なインデックスだ。
あと自動リンク削除などあまりにも製作者・管理者側に偏りすぎ。

一回の投稿行数1行減らしてでももう少しユーザーフレンドリーなものにしてくれよ
(厨房排斥が目的なら知らんけど)

523 :デフォルトの名無しさん :01/08/26 15:32
>>522
行数は、減らしても複数回に分けて書き込まれるだけ。
>(厨房排斥が目的なら知らんけど)
転送量を減らすのが目的なのだから、それもアリかもしれない。

524 :デフォルトの名無しさん :01/08/26 15:33
>>521
長さデータには、くずはの壊れにくさレベルを導入してな

525 :デフォルトの名無しさん :01/08/26 15:34
私も素人ですが、曜日の表示は復活して欲しいですね。
「名前」表示は無くても良いような気はしますが・・・。

526 :デフォルトの名無しさん :01/08/26 15:37
2001年8月25日。2チャンが本格的に閉鎖になりかけた日だよ。
転送量が多すぎて、費用が¥7,000,000/月もかかってるって発表されて、
「数日中に閉鎖」って予告されてさ、 その日のうちにあっちこっちの板が封鎖されてた日だよ。
一時HTTPブラウザの表示が極少化されちまった。あのときのUNIX板の住人、カッコよかったんだぜ。
「総力を結集」ってのは まさにああいう状態だよ。
HTTP転送量を1/3に削減しないと閉鎖、ってもんだから、新しいプログラム組んでさ、
そしたらほんの何時間かで完成したんだよ。
それが聞いてくれよ、
目標は「1/3」だったのに、「1/16」まで圧縮に成功しやがったんだよ。
職人技なんてもんじゃねえよ、神技だよ


     |          |
     |          |
     十          十
     (`  ∧_∧     (`  ∧_∧             UNIX板・プログラマー板
  ()lll()\(´∀` ) ()lll()\(´∀` )                マンセー
  / ・ \ヾUnixと)  / ・ \ヾ PG と)          \___ ____ ___/
 (_人   \ ノ ) (_人   \ ノ )   ,,,,,.           ∨     .∨         オツカレサマー
    人 ノ  (_)~⌒`ヾ人 ノ  (_)~⌒`ヾ^lll.         ∧_∧   ∧∧      ∧ ∧__.
    ( < | ソ    /   ( < | ソ    /   ,)|||.       ∩´∀` ∩∩゚Д゚∩   /(゚ー゚*∩ /\
    \ l ノーー''''/ ' ノ''|\ l ノーー''''/ ' ノ''|          ヾ    ソ ヾ |  |ノ  /| ̄∪ ̄ ̄|\/
      |_|.フ   ヾ、く.`l_|  |_|.フ   ヾ、く.`l_|            | | |    |  |,,〜  |____|/
      /_|。。 。  キ/ /_|.。/_|。。 。  キ/ /_|.。。 。 。   (__(____)   ∪∪      ∪∪

527 :518 :01/08/26 15:44
>>519
mlock()じゃダメだね スマソ......
Solaris上のlockf()だとできるみたいだけど... Linuxとか*BSDだと
flock()なのか? こちらでできるかは不明

528 :ナナシサソ :01/08/26 15:47
ロックするとマズイんじゃない?
ロックする時間を短くする為にBigbufferを使ってるんでは?

529 :デフォルトの名無しさん :01/08/26 15:48
もう面倒だからイチから書き直しちゃえば?

530 :デフォルトの名無しさん :01/08/26 15:50
>>520
> for(i=0;i<zz_fileSize;i++) {
> if(BigBuffer[i] == '\0') BigBuffer[i] = '*' ;
> }

for (i = zz_fileSize; --i >= 0; ) {
if(BigBuffer[i] == '\0') BigBuffer[i] = '*' ;
}

これで少し速くならない?(せこいけど…)

531 :デフォルトの名無しさん :01/08/26 15:53
>>530
C++に書き直してます、なんとなく。
そこの部分は後続の行数を数える関数とまとめて

env.lineMax = 0;
// TODO
char* p = env.BigBuffer;
char* pline = env.BigBuffer;
const char* const p1 = env.BigBuffer+env.fileSize;
for(; p!=p1; ++p0) {
switch(*p) {
case '\0':
*p='*';
break;
case '\n':
if(env.lineMax>RES_RED) {
goto exit_getenv;
}
env.BigLine[env.lineMax++] = pline;
pline = p+1;
*p = '\0';
break;
}
}
exit_getenv:
return 0;

としたほうが速いと思います。

532 :531 :01/08/26 15:54
C++固有コードとミスがあるけど愛嬌ってことで。

533 :デフォルトの名無しさん :01/08/26 15:57
>>526
神業では無いと思うけど・・・元の CGI が御タコ過ぎただけ。
でも、元の CGI が神業レベルで最適化されていたら、2CHは終わっていたな。。

しかし、焼け石に水か、、、あとは営業努力に期待しよう。

534 :名無し :01/08/26 15:58
今日モーニング娘の新メンバー決定があるので、
負荷テストが出来ると思います。

535 :デフォルトの名無しさん :01/08/26 16:00
>>526
ただでさえ「転送量が……」って言っているんだから、
何回も同じ文章を、しかもAA付きでコピペするのは
止めようや。

536 :デフォルトの名無しさん :01/08/26 16:20
Web製作版のほうで、
レスの表示数にFORMを使ってはどうかって意見が出てるよ。

537 :デフォルトの名無しさん :01/08/26 16:21
>>530
本気で高速化を考えているなら、その部分コメントアウトしちゃえ。
つか、dat_readとdat_outはまとめた方が速くなるような。

538 :デフォルトの名無しさん :01/08/26 16:23
43kのファイルの読み込み、内容の全スキャンを20000回ループさせた結果。
(gprofだと、カーネルで費やされた時間が出なかったので、bash-builtinのtimeで計測)

fread版:
real 1m3.433s
user 0m23.230s
sys 0m6.480s

mmap版:
real 0m50.591s
user 0m23.090s
sys 0m0.780s

この差を大きいとみるか、小さいとみるか。

539 :デフォルトの名無しさん :01/08/26 16:24
つまらない質問だったらごめん。

>530
'\0' を'*'に変換する処理って何の意味があるの?

540 :デフォルトの名無しさん :01/08/26 16:27
>>539
>>520を参照。壊れちゃってる物、仕方ないと思うけどなあ。
datファイルを直すのは、別スクリプトにしたら?

541 :デフォルトの名無しさん :01/08/26 16:28
>>538
systemでかなり差が出ているのでmmapを使うべきでしょう
ただでさえforkにgzipのexecとsystem酷使してますし…

542 :デフォルトの名無しさん :01/08/26 16:28
datファイルは\nで行を区切っているけど、
これをgetLineMaxで\n→\0に置換して行単位に、
res_splitで<>→\0\0に置換してフィールド単位に
ばらして、それぞれ\0終端文字列(いわゆるC形式の文字列)として
扱ってる。
なので、壊れたdatファイルで途中に\0が入ってると処理がおかしくなるので、
最初の段階で\0をつぶしてるらしい。

543 :デフォルトの名無しさん :01/08/26 16:33
>540 >542
にゃるほど、サンクス。

544 :デフォルトの名無しさん :01/08/26 16:34
>541
ただ、mmapにすると、バッファを書き換えられなくなるので、
現在のようにBigBufferを扱いやすいように修正しながら\0終端ベースの
処理ってのはできず、全体的に行、フィールドの先頭ポインタとその長さを保持して
それを使いながらの処理になる。
すろと、コストのかかる部分が移動するかもしれない。
あと、readの動作中にあぼーんが発生すると、mmapで得たバッファの内容がずれる
リスクがある(普通の書き込みなら追加なので問題ないと思う)。

545 :デフォルトの名無しさん :01/08/26 16:36
>539
いや、実はよく分かっていません。
元ソースのdat_read()にそういう処理があるっていうだけで…

推測ですが、datの読み込み後、何らかの理由でバッファに'\0'が入ってきた場合
他の関数の処理に不都合をもたらすので、
とりあえず'*'に変換しとけ、っていうだけかも知れません。
(実際はあり得ない?)

546 :デフォルトの名無しさん :01/08/26 16:37
とりあえずこんなんでもかなり効くよ
if (strlen(BigBuffer) != zz_fileSize) {
 for(i=0;i<zz_fileSize;i++)
 {
 if (BigBuffer[i] == '\0') BigBuffer[i] = '*';
 }
}

標準関数侮れず

547 :datについて知ってること :01/08/26 16:38
誰かdatのきちんとした仕様を知ってる人いる?
サーバによってあぼーんされた時の挙動が違ったりする。
一番最後のデミリタがなくなる事がある。
あぼーんのスクリプトによっても違うみたい。入り混じってる。
デミリタが減るのは1があぼーんされる時にしか出ない気がする。

あとバイナリ貼り付けたりすると、本文中に<>が出現することもある。
レス1件にデミリタが10個とかって事もあった。

'\0'はエレメントの頭かケツにしか付かないと思う。
10000個くらい調べたけど、要素の途中に挟まってるのは見つからんかった。

この手の話は多分みみずんが一番詳しいと思う。

548 :545 :01/08/26 16:38
げ、考えてる間に正確なレスが。バカ丸出しで逝ってきます。(w

549 :デフォルトの名無しさん :01/08/26 16:40
>>546
結局BigBufferを最後まで一文字ずつ調べるわけで、
まあ、BigBuffer[i]='*';が無いだけ速いか。

550 :デフォルトの名無しさん :01/08/26 16:42
>546
すばらしい。strlenみたいな多用されるやつは、アセンブラレベルで、
カリカリにチューンされてるはずだからね。

551 :デフォルトの名無しさん :01/08/26 16:43
あとres_split()内でfindSplitter()も使うのやめちゃって
p0 = strstr(s[i-1],"<>");
の方が速いよ

まあ546の変更とあわせて実時間10.89秒が9.93秒になるくらいなのだけども

552 :549 :01/08/26 16:43
>>549
自己レス。
if(BigBuffer[i]=='\0')が成立しなければ一緒だ。逆に遅いか?
ライブラリ内部がアセンブラででも最適化されてりゃ速い、
かもしれない。

553 :550 :01/08/26 16:43
いや、よく考えたら、strlenの結果使えば、'\0'の位置なんて
既にわかっていることに気づいた。

554 :デフォルトの名無しさん :01/08/26 16:45
>>553
'\0'が複数含まれていた場合を忘れてる。

555 :550 :01/08/26 16:46
int pos;
while ((pos = strnlen(BigBuffer, zz_fileSize)) != zz_fileSize)
  BigBuffer[pos] = '*';
か。

556 :554 :01/08/26 16:47
>>555
失礼、忘れて無かった。

557 :デフォルトの名無しさん :01/08/26 16:49
>>553
これでいけるってこと?

int BufferLen = strlen(BigBuffer);
if (BufferLen != zz_fileSize) {
 if (BigBuffer[BufferLen] == '\0') BigBuffer[i] = '*';
}

558 :デフォルトの名無しさん :01/08/26 16:50
int pos;
char *p = BigBuffer;
int rest = zz_fileSize;
while ((pos = strnlen(p, rest)) != rest)
{
p[pos] = '*';
p += pos + 1;
rest -= pos + 1;
}

559 :554 :01/08/26 16:51
>>558
それなら複数'\0'があったときもコストが高くならなくていいね。

560 :デフォルトの名無しさん :01/08/26 16:51
strnlenも早いの?

561 :デフォルトの名無しさん :01/08/26 16:52
>>552
少なくともLinuxのglibcの環境においては-O2つけたとしてもライブラリ使ったほうが速いようだ

562 :デフォルトの名無しさん :01/08/26 16:53
http://piza2.2ch.net/jisaku/dat/980503747.dat
↑の2001/05/09(水) 12:41のすぐ上のレスみたいなのでも行ける?

563 :デフォルトの名無しさん :01/08/26 16:54
みんなで力を合わせれ!

gzip 圧縮や Last-Modified 対応など
転送量軽減に関する話題は↓こちらでお願いします。
2ch閉鎖の危機なんだと @UNIX板
Part2.1
http://cocoa.2ch.net/test/read.cgi?bbs=unix&key=998754174
Part3.1
http://cocoa.2ch.net/test/read.cgi?bbs=unix&key=998764722
↑作業がほぼまとまったためプログラム板の
プログラマが2chを救う!?に移動したようです。

read.cgi の無駄なコードの省略や高速化など
関数毎の最適化については↓こちらでお願いします。
プログラマが2chを救う!? @プログラム板
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=998736516
2号
http://natto.2ch.net/test/read.cgi?bbs=hp&key=998774537

無駄なタグの消去やHTMLの修正などは↓こちらでお願いします。
スキルの高い方知恵を貸してください @web制作管理板
http://natto.2ch.net/test/read.cgi?bbs=hp&key=998741961

新CGIが導入された板の動作報告は↓こちらにどうぞ。
2chの動作報告はここで。 @批判要望板
http://teri.2ch.net/test/read.cgi?bbs=accuse&key=998808733

応援やグチ、今後の2chはどうなるか、
何故この事態が起こったかなどの議論は↓こちらでどうぞ。
UNIX板で2chのプログラムを開発中 @批判要望板
パート2
http://teri.2ch.net/test/read.cgi?bbs=accuse&key=998757160
パート3
http://teri.2ch.net/test/read.cgi?bbs=accuse&key=998765190


なおUNIX板では
・板の統廃合についてのスレ
・浩之氏の公式発言についてのスレ
・それぞれの板の問題点をあげるスレ
などが立っています。


他の板の住人へ

ここのURLを張らないで応援板のURLを張ってください。

564 :デフォルトの名無しさん :01/08/26 16:56
>'\0' を'*'に変換する処理
これって、いかにも付け焼刃的に「バグを見つけたのであとから付けました」って
感じがするんだよね。
というのは、直後で行数を数えるために全体をスキャンしているのに
同時に行っていないから。

全体をスキャンするのは1回にして、
ただし、全てを同時に行う。
やることは、
・行区切りの検索と位置保存
・'\0'の'*'への変換
・&amp -> & への 変換 … ただし、&amp; は変換しない
(・@+`の変換 … そのレスは前に詰めなければいけない)
(・&quot; ??)

つーかさ、Splitした結果をBigLineに持たせるべき。
struct lines {
  char *name;
  char *mail;
  char *date;
  char *text;
};

それと、機能追加?になるけどあった方が良いと思うのがさ、
オプションでのtext内部にある<br>以外のタグの削除ね。
要は>>nnがえらく転送量をふやしちゃうんだから、
<a href=...> と </a>のタグを無条件に削除するオプションがあってもいい。
ただ、BigBuffer内部で前詰めになるから、面倒くさいし、
各レスの先頭にタグが入っている場合が多いから、
実質memmoveの繰り返しになっちゃいそう。

それなるくらいなら、BigBufferの他にもう一つバッファを作って、
コピーしながら置換したほうがいいかもしれないけどね。
これなら、mmapとも併用できるでしょ。

565 :がいしゅつ? :01/08/26 16:59
一つ分かったことは、
「ひろゆきがプログラマとしてタコである」
ということだ。

566 :  :01/08/26 17:00
>>565
ここまでの負荷を想定してはじめから作っていたのならそうかもな。
でもソレはありえないだろ。

567 :デフォルトの名無しさん :01/08/26 17:02
>>564
>オプションでのtext内部にある<br>以外のタグの削除ね。
コストが高いと思うなあ。それはbbbs.cgiでやった方が良いのでは?

568 :デフォルトの名無しさん :01/08/26 17:03
今までスクリプトって博之がつくってたの?

569 :デフォルトの名無しさん :01/08/26 17:05
今のスクリプトはひろゆきじゃないはず。C言語出来ないって言ってた。

570 :名無し ◆NtVkSITE :01/08/26 17:05
>>568
トオルさんや削除忍さんのようですが。

571 :G :01/08/26 17:05
**********************************

あのさ、もうUNIX板でのZIP関係の手入れは一段落したんだから、
つぎはこのスレでのコード最適化結果をどんどん実際に反映していこう。
生きてるFTPサーバか何かを提供してくれる人と、トランクソースに
ここで出てきた差し替えコードを反映する、意欲あるプログラマの人は
手を上げてくれよ。
俺?すまそ、力不足だ。

*********************************

572 :名無し :01/08/26 17:07
暫定版をリリースして、
デザインを含めて1からプログラムを
作り直したほうがよいと思う。

新しいプロジェクトを立ち上げましょうよ。

573 :G  :01/08/26 17:08
ちなみに571をカキコしようとして、書き込むボタンを押したら
一面文字化けのページが帰ってきたぞ。
read.cgi ver5.02には、チューニング以前のバグもまだあるのか?

574 :デフォルトの名無しさん :01/08/26 17:09
ひろゆきって専攻何?
大学4年の夏に米国に心理学の留学行っている。
プログラマーじゃないのかな?

575 :G  :01/08/26 17:09
ていうか
http://piza2.2ch.net/tech/index2.htm
をまともに読めるヤツいる?

576 :デフォルトの名無しさん :01/08/26 17:10
>>575
読めてるよ。

577 :デフォルトの名無しさん :01/08/26 17:11
>>575
IEでhttp/1.1チェック入れてないとか?

578 :G  :01/08/26 17:12
分かった。
カキコすると自動的に飛んでいく
http://piza2.2ch.net/tech/index2.htm
は今明らかにバグってて、
正しいのは
http://piza2.2ch.net/tech/index2.html
だよ。これはすぐ直せるだろうけど、
どうすりゃいいんだよ。

579 :名無し娘。 ◆vP.bOZFQ :01/08/26 17:13
Unix板の方で、最新版が
http://star.endless.ne.jp/users/forcount/contents/scriptmaker/read11.c
から
http://star.endless.ne.jp/users/forcount/contents/scriptmaker/read11.rev1.c
に更新されました。
変更点は、613行目
- if(pid=fork() == 0){
+ if((pid=fork()) == 0){

580 :デフォルトの名無しさん :01/08/26 17:13
>>572
それをやるなら、datのフォーマットから見直したいな。
ls=10でもdatを全部読み込むってのは、ちょっとなあ。

581 :デフォルトの名無しさん :01/08/26 17:15
1にも書いてあるが、今のところ道は3つだと思ってる。

1)発想はそのままでCode書き直しなど全面書き換え最適化を行う
2)P2Pで頑張る
3)その他のアイデアでやってみる

現状動いているのは2だけだけど、1に手を付けるのもいいかもしれない。
3はまだ未知数。

582 :デフォルトの名無しさん :01/08/26 17:16
datフォーマットを見直さなくても
レスの位置を記録したインデックス作るだけで
かなり効果無い?

583 :デフォルトの名無しさん :01/08/26 17:17
>580
だよねぇ。
ファイルにインデックスでもつけたほうがいいよね。
既存のデータをどうするかが問題だけど。

584 :デフォルトの名無しさん :01/08/26 17:19
インデックスは付けたいね。
でもそれをやるとすると、bbs.cgiの方に手を入れなくてはならない。
bbs.cgiのソースは公開されてた?

585 :デフォルトの名無しさん :01/08/26 17:20
>>578
バグではありません、仕様です(w
負荷低減のため、htm側はzip圧縮ページなのな。
mod_gzip入るまで待ちんしゃい。

586 :デフォルトの名無しさん :01/08/26 17:20
>>584
されてない。read.cgiのみ。

587 :デフォルトの名無しさん :01/08/26 17:22
そういうの突き詰めていくとバックエンドのデータはRDBで管理して、クライアント処理は
Servletで、とかなってくんだけどサーバ側の事情でアーキテクチャを大きく変えるのは難しそう。

俺的には read.cgi の mod_2ch (Apache module) 化のが一つのゴールかなあ、って思うが。

588 :デフォルトの名無しちん :01/08/26 17:23
>>585
mod_gzipになるまでまだ1週間以上あるみたいだから
とりあえず今は「.html」に飛ぶようにしておいた方がいいんじゃないの?

589 :デフォルトの名無しさん :01/08/26 17:25
すこし前に11REV1を落とされた方
修正ミスでした
今は修正完了です
アドレスは同じです

590 :564 :01/08/26 17:26
よーく考えたら、Splitや置換って全体に対しては必要なかったね。
実際のls=??等のリクエストがどんな割合で来てるのかわからんけど。

つーことは逆に、
getLineMax()にFileSizeを与えて、memchrで行を数えて、
'\0'->'*'への置換をout_html()で行うようにするほうがいいかな?
レスを全部読む場合は、全体を一括スキャンしたほうが効率的だろうけど、
トータルではどうなるか。

で、もし全体をスキャンするなら、特殊文字('\0','\n','<','&'等)をテーブルにして
if (teble[*p] & flag) {
  switch (*p)
    ...
}
みたいな感じが良さそう。
else if の繰り返しや全体をswitchにしてしまうよりまともだと思う。
(負荷的には、キャッシュの関係があるから、試してみないとわからないけど)

テーブルは8bitあるから、日本語文字やURLの終端判別にも使える。
これも、スタートアップでテーブルを作るほうがソース的には楽だけど、
負荷を考えると自力で作った方が良いかもね。

なんか俺も良くわかってないから、素直に推移を見守りますわ。

591 :デフォルトの名無しさん :01/08/26 17:27
インデックス付けると、bbs.cgi以外にも、あぼ〜ん処理とかも
全部対応させなくちゃならない。それこそ大作業になるよ。

592 :デフォルトの名無しさん :01/08/26 17:28
>>587
mod_gzip付けるだけでも汎用のサーバーがどうのもめていたらしいからmod_2chというのも厳しいのではないかな?
現状のデザインに不満を漏らしつつも何とか地道な改善を施すのはPGの宿命だよ。

593 :563 :01/08/26 17:33
あ、間違ってた・・・
プログラマが2chを救う!? @プログラム板
の2号は
スキルの高い方知恵を貸してください @web制作管理板
の方の2号だ。

594 :デフォルトの名無しさん :01/08/26 17:55
だからさーーーーー、早く実際の作業始めよーよー。

595 :名無し娘。 ◆vP.bOZFQ :01/08/26 17:55
お邪魔かもしれませんが、ちとまとめてみます。(作業中)

596 :デフォルトの名無しさん :01/08/26 17:55
/*行区切りの検索、'\0'の変換、&->&の変換を一度にやるソース案*/

char* pin = BigBuffer;
char* linepin = BigBuffer;
int line = 0;

while(pin < &BigBuffer[zz_fileSize]){
  switch(*pin){
    case '\n':
      BigLine[line] = linepin;
      *pin = '\0';
      pin++;
      linepin = pin;
      line++;
      if(line > RES_RED){
        goto wend;
      }
      break;

    case '\0':
      *pin = '*';
      pin++;
      break;

    case '&':
      if(strncmp(pin, "&", 5) == 0){
        pin += 5;
      }else if(strncmp(pin, "&", 4) == 0){
        /*・・・・(^^;*/
        pin += 4;
      }
      break;

    default:
      pin++;
      break;
  }

}

wend:
/*続き*/;

597 :デフォルトの名無しさん :01/08/26 17:57
JavaやDelphiのような優れた言語を使わず、
Cなんていう時代遅れの処理系を使っているのはなぜなんでしょう。
それとも、ドキュンしかいないのでしょうか。

598 :名無し娘。 ◆vP.bOZFQ :01/08/26 18:00
(あ、お話はどんどん続けておいてください)

599 :sage :01/08/26 18:01
速いからじゃないの?

600 :デフォルトの名無しさん :01/08/26 18:01
>>597
おまえいつからプログラムはじめた?

601 :デフォルトの名無しさん :01/08/26 18:01
Delphiて・・・2ちゃんってNTサーバーだっけ?

602 :デフォルトの名無しさん :01/08/26 18:02
あおりはほーちちまちょー

603 :デフォルトの名無しさん :01/08/26 18:02
>>597
はいはい中学生は学校の宿題でもしてて

604 :デフォルトの名無しさん :01/08/26 18:03
597 はいつもの厨房なので無視という方向で。

605 :デフォルトの名無しさん :01/08/26 18:05
ところでこれまでに出た改良案をすべて
取り込んだものはどれくらい早くなるの?
誰か試して。

#俺もやりたいけど今手元にwinしかない、、。

606 :デフォルトの名無しさん :01/08/26 18:07
>605
ダッシュでCygwin落とせ。apacheも動くぞ。
http://sources.redhat.com/cygwin/

607 :デフォルトの名無しさん :01/08/26 18:10
>>597
実際軽く動くのはどっち?

608 :デフォルトの名無しさん :01/08/26 18:11
bbs.cgiのソースは何故公開されない?

609 :デフォルトの名無しさん :01/08/26 18:13
>608
実はばっちりログを保存していて、
それがばれるのがいやだから。

だったりして。

610 :デフォルトの名無しさん :01/08/26 18:14
>>608
ソース見ていたずらを思いつく人が出てくるからでは?

231KB
新着レスの表示

スレッドリストへ戻る 全部 前100 次100 最新50

0ch BBS 2004-10-30