为什么下面的代码在php(oci)中比c ++(occi)更快? 对于50k行,php在30s内执行脚本。程序在5分钟内执行!
/* php - oci code */
$s = oci_parse($c, 'select "client" from test');
oci_execute($s, OCI_DEFAULT);
while ($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS))
{
$i++;
if ($i%1000 == 0) echo $i.' '.$row['client'].PHP_EOL;
}
/* c++ occi code */
string q("select client from test");
ora_stmt = ora_conn->createStatement (q);
ora_stmt->setPrefetchRowCount(1000); // THIS IS AN ANSWER
ResultSet *rset = ora_stmt->executeQuery();
while (rset->next ())
{
i++;
if (i%1000 == 0) cout << i << endl;
}
有什么方法可以改善环境?
我的回答:
ora_stmt->setPrefetchRowCount(1000);
的
答案 0 :(得分:4)
通过文档的快速浏览揭示了上面提到的@unapersson可能是正确的,一旦你构造了Statement
,在执行查询之前,可能值得玩下面的设置:
setPrefetchMemorySize()
设置将要的内存量 由OCCI内部使用来存储数据 在每次往返旅程中取得 服务器
setPrefetchRowCount()
设置将包含的行数 每次都由OCCI内部提取 往返服务器。
我的印象是,对next()
的每次调用都可能触发到服务器的往返。
答案 1 :(得分:1)
我不懂PHP,所以我不能在那方评论。在C ++方面,你在每次写入后刷新输出流,这可能是很多不需要的刷新。移除endl
并使用'\n'
并再次测试:
if ( i % 1000 == 0 ) cout << i << '\n';