Re: [Boost-users] Boost interprocess containers - performance issue

Date: Sun, 11 Mar 2012 12:21:36 +0100 From: Ion Gazta?aga
To: Boost User List Subject: Re: [Boost-users] Boost interprocess containers - performance issue Message-ID: <4F5C8AC0.9020508@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed
El 11/03/2012 1:00, Naveen Santhapuri escribi?:
Hello all,
I am experimenting with Boost interprocess containers and like the ease of using them. I want to use these in place of the "linux shared memory+shared memory allocator + std containers". However, I am seeing some performance hit when using boost. I measured the times for vector access from shared memory. I define access as indexing into the vector (v[i]) (all times in milli seconds):
Num elements Local heap | Boost ipc | Shmat() 100,000 0.23 0.39 0.27 1,000,000 2.3 3.85 2.7
What does Shmat mean? Are you putting a std::vector directly in a shared memory segment?
Obviously if you put boost containers in shared memory you don't store raw pointers (as every process can map the memory in a different address, making raw pointers unusable). When using offset_ptr we have a performance hit as we need to calculate the real address computing a pointer arithmetic (this + stored offset). Apart from that, as offset_ptr relies on undefined behaviour, the offset calculation must be marked as non-inlineable in most compilers, increasing the performance hit. I think it can be improved using some kind of compiler-specific annotations or assembler, but I have no skills to do that nowadays.
Best,
Ion
Thank you for the reply Ion. Re: shmat() - Yes, I am creating a std::vector with shared allocator in shared memory. My use case: One executable (lets call it shvec) writes std containers to shared memory. Another instance of shvec reads those containers from shared memory. I want to do this to preload a large amount of data into memory, before my service starts, so that the start time of the service can be cut down. I want to use boost but I am afraid of the runtime hit. Even with the offset pointer, do the numbers above make sense (as much as 70% extra time)? My alternative strategy without boost ipc: I will be running on 64bit linux and hoping to map the shared memory segment to the same location in all instances using shmat(). To achieve that, the first instance gets the shared memory segment address, which will be used by the other instances that read from the shared memory. If I can map them to the same address, can I use raw pointers without any problem? Naveen

El 12/03/2012 3:54, Naveen Santhapuri escribió:
My alternative strategy without boost ipc: I will be running on 64bit linux and hoping to map the shared memory segment to the same location in all instances using shmat(). To achieve that, the first instance gets the shared memory segment address, which will be used by the other instances that read from the shared memory. If I can map them to the same address, can I use raw pointers without any problem?
Yes, if you manage to map it to the same address in all processes you can use raw pointers. However you still can't use virtual functions/base classes, as each processes has the virtual function table at a different address. Best, Ion
participants (2)
-
Ion Gaztañaga
-
Naveen Santhapuri