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

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

472 :aki :01/08/26 10:40
>>464
version w3m/0.2.1では試してみたんですが、書けてる見たいです…。
発言内容に依存してるのかも。

473 :名無し :01/08/26 10:45
UNIX板より

431 名前:原住民 :01/08/26 10:42
むむ、制限時間過ぎてもスレ全体を一括読みできない原因発見...
zz_GetEnv()と get_lastmod_str() の両方で gmtime()使ってるぞ!!
static領域に結果置いておくだけだから上書きされちゃうんだよね...

474 :デフォルトの名無しさん :01/08/26 10:45
>>471
これ同意。
レス50個単位とかで前後できるリンクもいつもあった方がいいね。
でも、激しくスレ違いな気がするYO!

475 :デフォルトの名無しさん :01/08/26 10:45
>>472
こっちも0.2.1です。
ソース全体をpreで囲わないのはこういうものなんですか?
あと、編集ボタンを押すとソース内のタグがescapeされないのもこういうもんかな?

476 :デフォルトの名無しさん :01/08/26 10:48
ごめん、寝る。

477 :名無しさん@ミポリソ@UNIX板 :01/08/26 11:08
>>473
とにかくグローバル変数の使い過ぎで関数の独立性が損なわれてるね
グローバル変数である必要がないものはローカル変数にした方がいいね

あと

int get_lastmod_str(time_t lastmod){
-   strftime(lastmod_str, 1024, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&lastmod));
+   strftime(lastmod_str, 1024, "%a, %d %b %Y %H:%M:%S %Z", localtime(&lastmod));

int zz_GetEnv(void)
{
   currentTime = (long)time(&t_now);
   time(&t_now);
-   t_now += 9*60*60;
-   tm_now = gmtime(&t_now);
+   tm_now = localtime(&t_now);

にして If-Modified-Since の判定もApacheのap_parseHTTPdate()みたいなの
使ってちゃんとtime_tにパースしてから比較した方がいいね

あと これは実現可能性の面が問題だけど 仮にCGIをApacheモジュールの
形に書き換えてApache2.xの上で動かすとなると マルチスレッド対応と
いうことで 各関数をreentrantにしておいた方がいいのかもね
その意味からも グローバル変数やstatic変数の利用はできるだけ
避けた方がいいと思う

478 :デフォルトの名無しさん :01/08/26 11:08
タグの短縮も重要だが、
read.cgi に渡される bbs, key, st, to なども1文字に短縮して、
read.cgi 側で新旧どちらにも対応すれば index2 あたりでは
100文字を超える節約になるのでは。

479 :478 :01/08/26 11:12
zz_GetString あたりの処理を簡略化して、
b で始まっていたら bbs, k なら key などと判断する、という意味。

480 :デフォルトの名無しさん :01/08/26 11:16
moduleにするんだったらそもそもmod_cgi経由のインタフェースが使えな
いから全面書きなおしでしょ。負荷はたいしたことないと言っていたから
cgiのままでいいと思うんだけど。fastcgi案も出てたっけか。

481 :  :01/08/26 11:17
                 _ , -―-、
              , 'ニニニ、::::(0::::::::::ヽ、
                ̄ ̄ヽ':::::::::::::::  ヾ みてごらん>>1を あれが夏厨だよ
                   ):::  ....   \
                  /    ::::::::::::::::::ヽ
                  /      :::::::::::::::::|
                 /       :::::::::::::::::|
                 /        :::::::::::::::::::|
                /        ::::::::::::::::::::|
                |         :::::::::::::::::::::|
               . |         :::::::::::::::::::::|
          _ , ―-、|         /::::::::::::::/::::|
          \ヲ'⌒ヽ:|         /:::::::::::::::/::::::|
            ト`_ ノ::|        /:::::::::::::/::::::::|
           人;;;;;;;::::;:|        |:::::::::::::/::::::::/
          /γ  `:::::|       |::::::::::::/::::::::/
          / (  ヽ   :::|       |:::::::::/::::::::/   ふーん、なんだか
         {  }  )  ::|       |::::::::{::::::::/    頭悪そうだね、ぱぱ
          | /   }   ::|       .ヽ::::|:::::::/
          ) {  /   ::|       .ヽノ ::::/
          } |  (    :λ         :::|
         ( ヽ、 )    ノヽ        ::::|
          ヽ,   ~    〈  ト、_  |    ::::::ヽ、
          (     ,' ノ  |   |~7  ::::::::::::::`ヽ、
           ヽ,、,、,γ' ノ, -‐W~フ {  ト、:::::::::::::::::::ヽ、
          ∠____ト-┘z__,―' ̄Σ Z  ̄ヽ―-、_ノ
                    '―z_,┴'~

482 :デフォルトの名無しさん :01/08/26 11:21
Apache2 系列の時刻解析関数は
apr-util モジュールに apr_date_parse_http() があるから
こっちがいいね。apr-util/misc/apr_date.c の中。

483 :Perler ◆GSi39OA6 :01/08/26 11:31
>>477

> +   strftime(lastmod_str, 1024, "%a, %d %b %Y %H:%M:%S %Z", localtime(&lastmod));

HTTP-dateはGMTに「しなければならない(MUST)」です。
下手にJSTなんか入れたら動作しなくなるUAが出てくると思う。

RFC 2068

3.3 Date/Time Formats

3.3.1 Full Date
All HTTP date/time stamps MUST be represented in Greenwich Mean Time
(GMT), without exception. This is indicated in the first two formats
by the inclusion of "GMT" as the three-letter abbreviation for time
zone, and MUST be assumed when reading the asctime format.

ということですので宜しくお願いします。

484 :ero :01/08/26 11:32
http://www1.sphere.ne.jp/kengo.21/ero.html

485 :デフォルトの名無しさん :01/08/26 11:37
えらい、コード読みづらいんですけど・・・

ラフな仕様書から作った方がいいって。
あとグローバル変数多すぎ。
コメント少なすぎ。

486 :デフォルトの名無しさん :01/08/26 11:42
誰かプロファイラ掛けた結果見せて

487 :477 :01/08/26 11:45
>>483 Perler様お疲れ様でした
確かにHTTPの場合GMTでないとほとんどの場合まずいようです すみません
ただ RFC2068 は現在obsoleteになっていて RFC2616 が現行のHTTPに
なってますので......

488 :デフォルトの名無しさん :01/08/26 11:49
関数の仕様書・コメント・修正済みコードのコピペ場所はこちらです。
http://www.gedoh.org/aki/2ch/wiki/yukiwiki.cgi?[[726561642E63676982F08D8291AC89BB32]]

コピペの仕方に一癖あるので
まず[[ソースを貼る際の注意事項]]を読んでください。

489 :Perler ◆GSi39OA6 :01/08/26 12:10
>>487
そうでしたね。RFC2616の該当部分は、

RFC 2616

3.3 Date/Time Formats
3.3.1 Full Date

All HTTP date/time stamps MUST be represented in Greenwich Mean Time
(GMT), without exception. For the purposes of HTTP, GMT is exactly
equal to UTC (Coordinated Universal Time). This is indicated in the
first two formats by the inclusion of "GMT" as the three-letter
abbreviation for time zone, and MUST be assumed when reading the
asctime format.

ここになりますか。

490 :デフォルトの名無しさん :01/08/26 12:24
あの、「今はそんな事言ってる場合じやない」と怒られるかも
しれないけど、書いていいですか。

大元のread.cgiのソースって、悪いプログラムの見本のような・・・・
データがコードで書かれているというのは、かなり痛いと思う。

491 :デフォルトの名無しさん :01/08/26 12:53
まだ「名前:」「投稿日:」消せないの?

492 :デフォルトの名無しさん :01/08/26 12:58
>>491
すれ違い

493 :初学者26 :01/08/26 13:01
「次の100レス」が消えてます。あちらに報告してきますね。

494 :デフォルトの名無しさん :01/08/26 13:09
>>490
がいしゅつ
まあ最初は誰にも見せないつもりだったんだろ

495 :名無し :01/08/26 13:14
read.cgi のインストールは誰がやってくれるんでしょうか?

496 :名無しさん@ミポリソ@UNIX板 :01/08/26 13:22
圧縮率ってgzipよりbzip2の方が高いよね?
でもブラウザがbzip2なんかほとんどサポートしてないか......
何かブラウザにbzip2デコーダ組み込んだりするうまい方法ないかね?

497 :デフォルトの名無しさん :01/08/26 13:24
read.cgiをプロファイラ(gprof)に掛けてみた結果
傾向がはっきりでるように1つのクエリに対してmain処理を1024回ループさせた

1) datが比較的大きい場合(130KB)

Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
42.76 1.21 1.21 1024 1181.64 1191.41 dat_read
37.46 2.27 1.06 1822724 0.58 0.58 findSplitter
6.01 2.44 0.17 455681 0.37 2.70 res_split
4.95 2.58 0.14 1020928 0.14 0.28 ExistHlinkX
4.59 2.71 0.13 5256192 0.02 0.02 hrefStop
1.77 2.76 0.05 455680 0.11 3.51 out_html
0.71 2.78 0.02 93184 0.21 0.21 cutWordOff
0.35 2.79 0.01 548864 0.02 0.55 ExistHlink
0.35 2.80 0.01 455680 0.02 0.70 hlinkReplace
0.35 2.81 0.01 93184 0.11 0.11 doReplace
0.35 2.82 0.01 1024 9.77 1572.27 dat_out
0.35 2.83 0.01 1024 9.77 9.77 getLineMax
0.00 2.83 0.00 455680 0.00 0.00 IsBusy2ch
0.00 2.83 0.00 7168 0.00 0.00 zz_GetString
0.00 2.83 0.00 2048 0.00 0.00 getFileSize
0.00 2.83 0.00 1024 0.00 0.00 BadAccess
0.00 2.83 0.00 1024 0.00 0.00 getFileLastmod
0.00 2.83 0.00 1024 0.00 0.00 get_lastmod_str
0.00 2.83 0.00 1024 0.00 0.00 html_foot
0.00 2.83 0.00 1024 0.00 0.00 logOut
0.00 2.83 0.00 1024 0.00 0.00 out_html1
0.00 2.83 0.00 1024 0.00 0.00 zz_GetEnv
0.00 2.83 0.00 1 0.00 0.00 html_head

498 :デフォルトの名無しさん :01/08/26 13:25
続き
2) datが比較的小さい場合(13KB)

Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ns/call ns/call name
51.52 0.17 0.17 167940 1012.27 1012.27 findSplitter
42.42 0.31 0.14 1024 136718.75 136718.75 dat_read
3.03 0.32 0.01 41985 238.18 4287.25 res_split
3.03 0.33 0.01 1024 9765.62 9765.62 BadAccess
0.00 0.33 0.00 83968 0.00 0.00 ExistHlinkX
0.00 0.33 0.00 41984 0.00 0.00 ExistHlink
0.00 0.33 0.00 41984 0.00 0.00 IsBusy2ch
0.00 0.33 0.00 41984 0.00 0.00 hlinkReplace
0.00 0.33 0.00 41984 0.00 4287.35 out_html
0.00 0.33 0.00 7168 0.00 0.00 zz_GetString
0.00 0.33 0.00 2048 0.00 0.00 getFileSize
0.00 0.33 0.00 1024 0.00 175781.25 dat_out
0.00 0.33 0.00 1024 0.00 0.00 getFileLastmod
0.00 0.33 0.00 1024 0.00 0.00 getLineMax
0.00 0.33 0.00 1024 0.00 0.00 get_lastmod_str
0.00 0.33 0.00 1024 0.00 0.00 html_foot
0.00 0.33 0.00 1024 0.00 9765.62 logOut
0.00 0.33 0.00 1024 0.00 0.00 out_html1
0.00 0.33 0.00 1024 0.00 0.00 zz_GetEnv
0.00 0.33 0.00 1 0.00 0.00 html_head

499 :デフォルトの名無しさん :01/08/26 13:25
>>496
MicrosoftとNetscapeに頼んで。

500 :名無し :01/08/26 13:26
ここのソース読めなくなったけど?

http://www.gedoh.org/aki/2ch/wiki/yukiwiki.cgi

501 :デフォルトの名無しさん :01/08/26 13:29
そういうわけで findSplitter() なんとかしねーとな

502 :デフォルトの名無しさん :01/08/26 13:33
区切り文字は現行のまま?

503 :デフォルトの名無しさん :01/08/26 13:55
>>494
レス全部読んでたけど、どのへんに出てきたっけ?

504 :aki :01/08/26 13:57
>>500
バージョンアップも含めてちょっと色々直してました。
リロードしてだめだったら再度教えて下さい。

荒らし対策に定期バックアップも仕掛けました。

505 :デフォルトの名無しさん :01/08/26 13:58
char *findSplitter(char *stt,int sp)
{
  unsigned char *p = (unsigned char*)stt;
  char ss = (unsigned char)(sp & 0x00ff);
 
  while(*p)
  {
    if( *p >= 0xa0 && *p <= 0xdf) {p++; continue;}
    if((*p >= 0x81 && *p <= 0x9f || *p >= 0xe0 && *p <= 0xfc)) { p += 2; continue;}
    if(*p == ss) return p;
    p++;
  }
  return NULL;
}

506 :デフォルトの名無しさん :01/08/26 14:06
ふしあなさんとかキャップの太くない文字ってdatにタグが入るんだっけ?

507 :デフォルトの名無しさん :01/08/26 14:16
>>505
>if((*p >= 0x81 && *p <= 0x9f || *p >= 0xe0 && *p <= 0xfc))  { p += 2 ; continue;}
if( (unsigned char)(*p^0x20-0xA1) <= 0x3B && *p!=0x80 ){p+=2;continue;}
こういう風に最適化出来ないかな?

508 :p0221-ipad01gifu.gifu.ocn.ne.jp :01/08/26 14:17


509 :デフォルトの名無しさん :01/08/26 14:18
datにもタグが入る。
だから > と < の連続でデリミタになってる。

510 :デフォルトの名無しさん :01/08/26 14:19
う、逆になった。。。
< と > ね。

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サーバか何かを提供してくれる人と、トランクソースに
ここで出てきた差し替えコードを反映する、意欲あるプログラマの人は
手を上げてくれよ。
俺?すまそ、力不足だ。

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

231KB
新着レスの表示

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

0ch BBS 2004-10-30