[Barrelfish-users] C++ standard library performance issue

Zaheer Chothia zaheer.chothia at gmail.com
Wed Oct 21 00:58:03 CEST 2015


Hi Jialin,

Rather than the data structure itself, my intial suspicion would lie
with one of:
* Random number generation (due to newlib vs. glibc)
* String copy constructor (== malloc + memcpy).  The default allocator in
  oldc is horribly slow; have a look at `lib/dmalloc/README.barrelfish`
  and try that for comparison.
More fine-grained timing may help tease these apart.  (I should also
mention I have not tried running the code at all!)

I imagine the hash map plays less of a role.  Reasoning: since you are
using the external toolchain it will link against libstdc++ which is
the same implementation as on Linux (discounting version differences).
On Barrelfish, C++ programs can also be compiled with Hake which will
instead use LLVM's libc++.  If you want to try this have a look at
`usr/tests/cxx/`.

Hope that helps.
--Zaheer

On Tue, Oct 20, 2015 at 12:07 AM, Jialin Li <nick.lijl at gmail.com> wrote:
> Hi,
>
> I'm running a server application on barrelfish(actually Arrakis). The server
> has to store some key value pairs so I used the standard library
> std::unordered_map. However, I was observing the server latency getting
> higher over time (with more key value pairs installed), from ~10us to a few
> ms. I wrote a toy program (shown below) just to validate the result. For the
> toy program, I also observed there are latency spikes every few operations,
> and the latency spike increases over time. I tried the same program on Linux
> and not seeing the same problem. For the C++ compiler, I am using
> tools/build-toolchain.sh, which I also attached.
>
> --------------------------
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <sys/time.h>
> #include <unordered_map>
> #include <list>
> #include <string>
>
> #define ITERATION 50000
>
> using namespace std;
>
> void randString(char * buffer, int len) {
>   for (int i = 0; i < len - 1; i++) {
>     buffer[i] = '0'+(random()%74);
>   }
> }
>
> int main() {
>   unordered_map<string, string> store;
>   char keybuf[32];
>   char valuebuf[128];
>   struct timeval st, ed;
>   memset(keybuf, 0, 32);
>   memset(valuebuf, 0, 128);
>   long int result;
>   unsigned long before, after;
>
>   for (long int k = 0; k < ITERATION; k++) {
>     gettimeofday(&st, NULL);
>     randString(keybuf, 32);
>     randString(valuebuf, 128);
>
>     string key(keybuf);
>     string value(valuebuf);
>     store[key] = value;
>
>     gettimeofday(&ed, NULL);
>
>     printf("latency %lu\n",
> (ed.tv_sec-st.tv_sec)*1000000+ed.tv_usec-st.tv_usec);
>   }
> }
>
>
> Let me know if any more information is needed. Thanks in advance for the
> help.
>
> Jialin
>
> _______________________________________________
> Barrelfish-users mailing list
> Barrelfish-users at lists.inf.ethz.ch
> https://lists.inf.ethz.ch/mailman/listinfo/barrelfish-users
>


More information about the Barrelfish-users mailing list