我需要帮助开发一个更快的算法,用于我的CGI文件(使用C)。我有四个sqlite3数据库表,其中包含两个参数attack_type和defend_type。这些表是mod_no,mod_ne,mod_av和mod_se。当函数double modifier(int attack_type, int defend)
时,如果在其中一个表中一起存在attack_type和defend_type的条目,则sqlite3语句从数据库中进行选择。根据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文件运行得很快。但是当我删除了初始值时,它又变慢了。
我需要一个有效的功能。我做错了什么?
答案 0 :(得分:0)
以下是一种可能的优化:
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循环。