1

找了高低找这个,一直没有找到明确的答案。我刚刚开始构建应用程序,我们决定将 Postgresql 用于我们的数据库,将 C 用于服务器。然而,一些初步测试显示了一些令人困惑的数字。似乎通过文本字符串访问数据库是最快的方法,这对我来说似乎违反直觉。当然,数据库在内部将整数和浮点数存储为二进制,并且必须将它们转换为文本,然后我必须将其转换回二进制才能使用。似乎更快的方法是将所有内容都保留为二进制文件,但到目前为止,我似乎无法获得二进制访问权限来显示这种好处。

这是我构建的一个简单测试用例,用于显示我所看到的(模式 + 代码)

http://pastebin.com/1AhB8avx

我看到这样的时间安排:

开始迭代 0... 迭代 0:在 35 秒内通过 PQparamExec 获取 50000 条二进制记录 迭代 0:在 34 秒内通过 PQexecf 获取 50000 条二进制记录 迭代 0:在 25 秒内通过 PQexec 获取 50000 条文本记录

额外的迭代只是或多或少地重复该模式。我也尝试直接使用 libpq 得到类似的结果,但没有将它们移植到这个测试用例中。

这符合您的经验,还是我只是在某个地方愚蠢?

谢谢!

4

1 回答 1

2

这似乎没有任何原因,事实上,在我的 ubuntu 桌面上运行代码时,我没有得到这样的区别:

开始迭代 0...
迭代 0:在 13 秒内通过 PQparamExec 获取 50000 条二进制记录
迭代 0:在 13 秒内通过 PQexecf 获取 50000 条二进制记录
迭代 0:在 12 秒内通过 PQexec 获取 50000 条文本记录

开始迭代 1...
迭代 1:在 13 秒内通过 PQparamExec 获取 50000 条二进制记录
迭代 1:在 14 秒内通过 PQexecf 获取 50000 条二进制记录
迭代 1:在 12 秒内通过 PQexec 获取 50000 条文本记录

开始迭代 2...
迭代 2:在 12 秒内通过 PQparamExec 获取 50000 条二进制记录
迭代 2:在 13 秒内通过 PQexecf 获取 50000 条二进制记录
迭代 2:在 11 秒内通过 PQexec 获取 50000 条文本记录

开始迭代 3...
迭代 3:在 12 秒内通过 PQparamExec 获取 50000 条二进制记录
迭代 3:在 12 秒内通过 PQexecf 获取 50000 条二进制记录
迭代 3:在 12 秒内通过 PQexec 获取 50000 条文本记录

开始迭代 4...
迭代 4:在 13 秒内通过 PQparamExec 获取 50000 条二进制记录
迭代 4:在 12 秒内通过 PQexecf 获取 50000 条二进制记录
迭代 4:在 12 秒内通过 PQexec 获取 50000 条文本记录

请注意,由于代码调用time()了两次来测量经过的时间,因此其精度为 2s,在这种情况下有点高。您应该考虑gettimeofday(),甚至更好地clock_gettime()考虑CLOCK_PROCESS_CPUTIME_ID.

于 2012-12-12T00:03:13.993 回答