On Mon, Apr 20, 2009 at 8:51 PM, Wink Saville <w...@google.com> wrote:

> I assume the wire format for all variations of protobuf
> are compatible of course there are no guarantees.


Yes, they are definitely compatible.


>
>
> In my little test program I'm using both and see that
> they are generating the same data so it is true for
> that one data point.
>
> -- Wink
>
>
> On Mon, Apr 20, 2009 at 6:46 PM, Alain M. <ala...@pobox.com> wrote:
>
>>
>> Is it possible to use protobuf-c in the embedded side and regular
>> protbuff in the PC side?
>>
>> This sound like a win-win option, or am I mistaken???
>>
>> Thanks in advance for feedback,
>> Alain
>>
>> Wink Saville escreveu:
>> > In the embedded systems they are both important. I potentially see 100's
>> > of messages being defined so generated code size could be a problem.
>> > Also, as I have no existing code right now an incompatible version isn't
>> > a problem for me.
>> >
>> > One thing that does surprise me is the cost of an enum in the generated
>> > code. My expectation is that there should be zero runtime cost. But is
>> > appears there is some need for a data structure to describe them, could
>> > you educate me why they need the extra infrastructure?
>> >
>> > -- Wink
>> >
>> > On Mon, Apr 20, 2009 at 10:15 AM, <lahike...@gmail.com
>> > <mailto:lahike...@gmail.com>> wrote:
>> >
>> >
>> >     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
>> >     <mailto: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
-~----------~----~----~----~------~----~------~--~---

Reply via email to