libmysql(c-api)比php-mysqli慢
我正在调查为什么我的C-test程序(libmysql)的速度几乎是同一个php测试(cli)程序的两倍: 我正在创建一个准备好的语句并插入10条记录 php cli版本(mysqlnd)的速度几乎是使用libmysql的C版本的两倍。 我是这样测试的: time./dbctest&&timelibmysql(c-api)比php-mysqli慢,php,c,performance,mysqli,libmysql,Php,C,Performance,Mysqli,Libmysql,我正在调查为什么我的C-test程序(libmysql)的速度几乎是同一个php测试(cli)程序的两倍: 我正在创建一个准备好的语句并插入10条记录 php cli版本(mysqlnd)的速度几乎是使用libmysql的C版本的两倍。 我是这样测试的: time./dbctest&&timephp phptest.php C版本: gcc dbctest.c-o dbctest-lm-lmysqlclient-lz-std=c99*/ #包括 #包括 #包括 #包括 #包括 char my_s
php phptest.php
C版本:
gcc dbctest.c-o dbctest-lm-lmysqlclient-lz-std=c99*/
#包括
#包括
#包括
#包括
#包括
char my_str[16];
int my_str_length=0;
静态void insert_记录(MYSQL_STMT*STMT)
{
char*stmt_str=“插入漂白值(?);
MYSQL_BIND参数[1];
//printf(“插入记录…\n”);
如果(mysql_stmt_prepare(stmt,stmt_str,strlen(stmt_str))!=0)
{
fprintf(标准,“\n准备…”);
返回;
}
memset((void*)param,0,sizeof(param));/*将结构归零*/
strcpy(my_str,“test”);
my_str[5]='\0';
my_str_length=strlen(my_str);
参数[0]。缓冲区类型=MYSQL类型字符串;
参数[0]。缓冲区=(void*)my_str;
参数[0]。缓冲区长度=sizeof(my_str);
参数[0]。为_null=0;
if(mysql\u stmt\u bind\u param(stmt,param)!=0)
{
fprintf(stderr,“\n cant bind…”);
返回;
}
对于(int i=1;i<10;i++)
{
如果(mysql\u stmt\u execute(stmt)!=0)
{
fprintf(stderr,“插入行时出错”);
返回;
}
}
}
int main(int argc,char*argv[])
{
MYSQL*康涅狄格州;
conn=mysql_init(NULL);
如果(conn==NULL)
{
printf(“错误%u:%s\n”,mysql\u errno(conn),mysql\u Error(conn));
出口(1);
}
如果(mysql\u real\u connect(conn,“127.0.0.1”,“root”,“password”,“test\u db”,0,NULL,0)=NULL)
{
printf(“错误%u:%s\n”,mysql\u errno(conn),mysql\u Error(conn));
出口(1);
}
MYSQL_STMT*STMT;
stmt=mysql\u stmt\u init(conn);
插入记录(stmt);
出口(0);
}
PHP版本:
我应该补充一点,我也使用-O2编译,没有差异
/*gcc dbctest.c -o dbctest -lm -lmysqlclient -lz -std=c99 */
#include <my_global.h>
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char my_str[16];
int my_str_length=0;
static void insert_records (MYSQL_STMT *stmt)
{
char *stmt_str = "insert into bleach values (?)";
MYSQL_BIND param[1];
//printf ("Inserting records...\n");
if (mysql_stmt_prepare (stmt, stmt_str, strlen (stmt_str)) != 0)
{
fprintf(stderr,"\nCant prepare...");
return;
}
memset ((void *) param, 0, sizeof (param)); /* zero the structures */
strcpy (my_str,"test");
my_str[5] = '\0';
my_str_length = strlen (my_str);
param[0].buffer_type = MYSQL_TYPE_STRING;
param[0].buffer = (void *) my_str;
param[0].buffer_length = sizeof (my_str);
param[0].is_null = 0;
if (mysql_stmt_bind_param (stmt, param) != 0)
{
fprintf(stderr,"\nCant bind..");
return;
}
for (int i = 1; i < 10; i++)
{
if (mysql_stmt_execute (stmt) != 0)
{
fprintf(stderr,"Error inserting row");
return;
}
}
}
int main (int argc, char *argv[])
{
MYSQL *conn;
conn = mysql_init(NULL);
if (conn == NULL)
{
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
exit(1);
}
if (mysql_real_connect(conn, "127.0.0.1", "root","password", "test_db", 0, NULL, 0) == NULL)
{
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
exit(1);
}
MYSQL_STMT *stmt;
stmt = mysql_stmt_init (conn);
insert_records(stmt);
exit (0);
}
<?php
$mysqli = new mysqli("127.0.0.1", "root", "password", "test_db");
$name = "TEST-PHP";
$stmt = $mysqli->prepare("insert into bleach values (?)");
$stmt->bind_param('s', $name);
for($i=0;$i< 10;$i++)
{
$stmt->execute();
}
$mysqli->close();
?>