1

私の CGI ファイルで (C を使用して) 使用するより高速なアルゴリズムの開発に助けが必要です。2 つのパラメーター attack_type と defence_type を含む 4 つの sqlite3 データベース テーブルがあります。これらのテーブルは、mod_no、mod_ne、mod_av、および mod_se です。function のdouble modifier(int attack_type, int defend)場合、sqlite3 ステートメントは、attack_type と defence_type のエントリがテーブルの 1 つに一緒に存在する場合、データベースから選択します。sqlite3 ステートメントが == 1 を生成するテーブルに応じて、関数は double データ型の特定の値を返します。

コードは次のとおりです。

double modifier(int attack_type, int defend_type)
{
    sqlite3 *conn;
    sqlite3_stmt *res;
    sqlite3_open("MP1.sl3", &conn);
    int i,n;
    int eff;
    char    temp[MAXLENGTH];
    char    mod_tables[4][8] = {"mod_no","mod_ne","mod_av","mod_se"};
    for (i = 0; i <=3; i++) {
        printf(temp, "select exists(select atk_typ,pok_typ from %s where atk_typ = %d and pok_typ = %d);",mod_tables[i],atk_typ, pok_typ);
        sqlite3_prepare_v2(conn,temp,MAXLENGTH,&res,NULL);
        while(sqlite3_step(res) != SQLITE_ROW) {
            n = sqlite3_column_int(res,0);
        }
        sqlite3_finalize(res);
        if (n == 1) eff = i;
        if (eff == i) break;

    }
    sqlite3_close(conn);
    return eff/(double)2;   
}

このコードの問題点は、(1) 値を返さないこと、および (2) 遅いことです。コードに問題があるかどうかをテストするeff = 2ために、関数が 1 を返すように初期化しました。CGI ファイルは高速で実行されました。しかし初期値を外すと元に戻りました。

私は働く機能を持っている必要があります。私は何を間違っていますか?

4

1 に答える 1

0

考えられる最適化の1つは次のとおりです。

select exists(select atk_typ,pok_typ from mod_no where atk_typ = %d and pok_typ = %d);",mod_tables[i],atk_typ, pok_typ)
union
select exists(select atk_typ,pok_typ from mod_ne where atk_typ = %d and pok_typ = %d);",mod_tables[i],atk_typ, pok_typ)
union
select exists(select atk_typ,pok_typ from mod_av where atk_typ = %d and pok_typ = %d);",mod_tables[i],atk_typ, pok_typ)
union
select exists(select atk_typ,pok_typ from mod_se where atk_typ = %d and pok_typ = %d);",mod_tables[i],atk_typ, pok_typ)

次に、クエリは1つだけで、外側のforループを取り除くことができます。

于 2012-09-25T15:01:45.683 に答える