Before PostgreSQL 9.1, adding additional features like data types was non-standard and awkward, but 9.1 brought extensions. By adding extensions as well as the plumbing for things like foreign data wrappers, the use of extensions have exploded over the last few years. This is great for people who are using PostgreSQL on Linux or similar type environments, but the people in Windows have been pretty much out of luck. Most people need to hope the extension they want to use is popular enough that someone skilled with Windows build environments decided to release the extension on Windows. It just was not as simple as Linux where you just run a “make install”.
For years, there has been the ability to replicate the Linux build experience on Windows with the Mingw project, but historically the resulting binaries have been significantly slower than the binaries produced by the Microsoft compiler. Since I last played with compliers on Windows, I have been pleasantly surprised that the open source build tools have caught up with the commercial tools and in some ways surpassed them.
To check the performance of the resulting binaries from the compilers, I tried a couple of CPU intensive tests. The first one was just a SELECT only pgbench test. The second was running the square roots of random numbers and then sorting the results. For the Windows binaries built with Microsoft Visual Studio, I used the PostgreSQL Windows installer from the PostgreSQL community site at http://www.postgresql.org/download/windows/. The Mingw-w64 build came from the bigsql.org site at http://www.bigsql.org/se/postgresql/packages.jsp
The version strings of the 2 binaries are below.
test=# select version(); version ------------------------------------------------------------- PostgreSQL 9.5.1, compiled by Visual C++ build 1800, 64-bit (1 row) test=# select version(); version --------------------------------------------------------------------------------------------------------- PostgreSQL 9.5.1 on x86_64-pc-mingw64, compiled by gcc.exe (Rev5, Built by MSYS2 project) 4.9.2, 64-bit (1 row)
For these tests, the only tuning of the postgresql.conf file was to set shared_buffers to 2GB. All other settings were left at the defaults.
The SELECT only pgbench test was conducted with the following command:
pgbench -n -S -c 10 -t 100000 -U postgres test
MSVC | 34246 TPS |
GCC | 34706 TPS |
That is a minor 1.3% performance improvement. That is not a ground breaking gain, but the gcc built binaries were consistently faster.
The second test was a bit more CPU intensive running the following query:
select sqrt((random() * g)::numeric) from generate_series(1, 1000) g order by 1;
This was put in a text file and run through pgbench with the following command:
pgbench.exe -n -f test.sql -c 8 -t 10000 -U postgres test
MSVC | 610 TPS |
GCC | 634 TPS |
This resulted in a larger performance gain of 3.8%.
I started this testing with trying to find an easier way to build extensions on Windows with hopes of not taking too much of a performance hit, but ended up finding that the easier way was actually a littler faster. I am thinking its time to ditch those proprietary build tools and stick with open source.