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

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

459 :  :01/08/26 10:08
web板信じれられないレベルの低さ、、、

460 :デフォルトの名無しさん :01/08/26 10:15
Web板はネット同人女の溜まり場だからな。
スキルに期待するのは間違ってる。

461 :デフォルトの名無しさん :01/08/26 10:22
まぁまぁ今は他人の批判してもめる余裕なんて無いのだから、抑えておこうよ。

462 :デフォルトの名無しさん :01/08/26 10:23
で、書きなおしませんか?
仕切る人1人にしないと混乱するから誰かやんない?

463 :デフォルトの名無しさん :01/08/26 10:28
そうなんだよね。
誰かコテハンで仕切ってよ。

464 :デフォルトの名無しさん :01/08/26 10:31
Wikiの方はなんだかうまく動かないな
w3mだからかな?

465 :デフォルトの名無しさん :01/08/26 10:33
そもそもさ、TABLEタグを利用しているのが重い原因なんじゃないの?
TABLEタグ使わなくても見やすいレイアウトにする工夫を。

466 :デフォルトの名無しさん :01/08/26 10:33
Web板ってナニ考えてるの?
必要なものを削ってドウスルンダヨ!

467 :デフォルトの名無しさん :01/08/26 10:33
Wikiはプログラムソースを貼り付けるもんではないと思われ。

468 :デフォルトの名無しさん :01/08/26 10:34
HTMLの話はどうでもいい

469 :初学者26 :01/08/26 10:35
>>38
変化はとっても勉強になります。
今回は口を挟むスキルに達していないのが残念でなりませんが,
少しでも2ちゃんねるのお役に立てるように勉強したいです。

470 :デフォルトの名無しさん :01/08/26 10:36
 /_      |
    /. \ ̄ ̄ ̄ ̄|
  /  /  ― ― |
  |  /    -  - |
  ||| (6      > |
 | | |     ┏━┓|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |     ┃─┃|  < 正直、救って欲しい。
|| | | |  \ ┃┃┃/    \________
| || | |    ̄  ̄|

471 :初学者26 :01/08/26 10:40
「最初のレス100」というのを追加して欲しいです。
最初から全部見たいときに「レスを全部読む」しかできないので。
時間によるアクセス制限時は強制的にそうなりますが,デフォルトでも
そういうコマンド(釦?)も欲しいです。少しは足しになりますか?

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;
}

231KB
新着レスの表示

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

0ch BBS 2004-10-30