Frankly I'm surprised so many people care about the generated code size - I'm generally much more interested in speed. For example, I suspect your C unpack() could be optimized quite a bit by using a custom allocator. Another example: probably the only change I'm likely to make to protobuf-c in the forseeable future is a rewrite of "pack()" to optimize packing of submessages... well, and i'll probably need to follow protobuf if it implements packed repeated fields (another great optimization).
If I were designing a C++ protobuf, I'd probably use the strategy I used for protobuf-c: make the reflection data so efficient and easy that you can optimize the hell out of the reflection-based api, thereby: - only needs one copy of the pack/unpack code, in the core library - eliminate the difference between optimize for speed or size -- it's really possible to do both! - minimizes the generated code to be practically nothing but introspection data - in theory, one could bind the C objects could to other languages using the reflection api Unfortunately, some amount of bloat is inherent in the C++ tradition of using accessor methods for the various members. More bloat from std::string. etc. So I'm not sure you "lite" you can get w/o making a completely incompatible version. - dave On Apr 19, 4:45 pm, Wink Saville <w...@google.com> wrote: > I've been looking at protobuf and I'm somewhat disappointed by the size of > the library on X86_64 and the size of the generated code for a simple > message: > > $ size libprotobuf.so > text data bss dec hex filename > 1008339 21344 1128 1030811 fba9b libprotobuf.so > > The flags for gcc I used for my simple test program was: > > CFLAGS := -Wall -g -DGOOGLE_NO_RTTI -o2 > > The simple protobuf message was: > > $ cat test1.proto > syntax = "proto2"; > option optimize_for = SPEED; > > package protobuf_tests; > > message test1 { > required int32 v = 1; > optional int32 o = 2; > repeated string s = 3; > > } > > Size when optimized for speed: > > text data bss dec hex filename > 15851 8 33 15892 3e14 test1.pb.o > > Size when not optimized for speed:: > > text data bss dec hex filename > 6852 8 33 6893 1aed test1.pb.o > > As would be expected the performance hit was pretty large, optimized for > speed: > > test1_cpp serialze Done total=0.656162secs 1000000 loops 656ns/loop > test1_cpp deserialize Done total=0.434740 1000000 loops 434ns/loop > > without optimized for speed: > > test1_cpp serialze Done total=1.994011secs 1000000 loops 1994ns/loop > test1_cpp deserialize Done total=1.609001 1000000 loops 1609ns/loop > > The two loops are below: > > nsecs_t start = system_time_ns(); > for (int i=loops; i != 0; i--) { > t.SerializeToString(&data); > } > nsecs_t stop = system_time_ns(); > > start = system_time_ns(); > for (int i=loops; i != 0; i--) { > x.ParseFromString(data); > } > stop = system_time_ns(); > > Given the above, I thought I'd try protobuf-c which appears to ignore the > speed option, > it is quite a bit smaller and somewhat faster on this simple message: > > text data bss dec hex filename > 1370 56 0 1426 592 test1.pb-c.o > 51751 1320 16 53087 cf5f libprotobuf-c.so > > test1_c serialze Done total=0.182868secs 1000000 loops 182ns/loop > test1_c deserialize Done total=0.420284 1000000 loops 420ns/loop > > The loops for protobuf-c are: > > nsecs_t start = system_time_ns(); > for (int i=loops; i != 0; i--) { > size = protobuf_tests__test1__get_packed_size(&t); > protobuf_tests__test1__pack(&t, data); > } > nsecs_t stop = system_time_ns(); > > start = system_time_ns(); > for (int i=loops; i != 0; i--) { > _ProtobufTests__Test1 *x = protobuf_tests__test1__unpack(NULL, size, > data); > protobuf_tests__test1__free_unpacked(x, NULL); > } > stop = system_time_ns(); > > So protobuf library is about 19x larger (1,000,000/52,000) and the code is > about 11x larger (16,000/1,400) > when optimized for speed and about 5x larger (6,00/1,400) when not optimized > for speed. I could be making > an inappropriate comparison and the protobuf-c is certainly not as mature > but it does look encouraging. > > This may not be news to anyone, but the large difference makes me wonder if > it would be worth > while to create protobuf-lite. What do people feel the minimum feature set > that would be needed > for protobuf-lite? Does anyone else feel a lite version would be desirable? > > Other ideas comments? > > -- Wink > > test1.tgz > 2KViewDownload --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to protobuf@googlegroups.com To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/protobuf?hl=en -~----------~----~----~----~------~----~------~--~---