1.8.1 Precompiled Messages
Performance can be significantly improved using a strategy of precompiling the constant portions of your message. Enumerations for example, are excellent candidates for precompilation. Using protobuf_message/3, the precompiled portion of the message is inserted directly in the wire-stream on encode, and is unified with, and removed from the wire-stream on decode. The following shows how the "send_command" example above, can be converted to precompiled form:
:- dynamic precompiled_message/3.
send_precompiled_command(Command, Vector, Msg) :-
basic_vector(Vector, Proto1),
precompiled_message(commands(Command), Msg, Tail),
protobuf_message(protobuf([embedded(3, Proto1)]), Tail).
precompile_commands :-
abolish(precompiled_message/3),
forall(protobufs:commands(Key, _),
( Proto = protobuf([atom(1, command),
enum(2, commands(Key))]),
protobuf_message(Proto, Msg, Tail),
assert(precompiled_message(commands(Key), Msg, Tail))
)),
compile_predicates([precompiled_message/3]).
*
*
*
:- initialization
precompile_commands.