When you define the interfaces to your application using the Interface Definition Language (IDL), you can minimize the time spent marshalling and unmarshalling passed parameters. Use simple structures and avoid pointers. If an RPC returns a pointer as an out parameter, the client-side unmarshalling routines needs to allocate memory for that parameter. Use reference pointers rather than full pointers when possible. In many cases reference pointers do not require memory allocation. You can reduce the number of pointers by flattening your data structures, replacing a pointer to an object with an instance of the object instead.
Do not transfer anything you do not really need. Use different data structures for different calls rather than complex one-size-fits-all structures with fields that many calls do not use. Instead of returning data back from one call to be passed back in subsequent calls, think about caching that data in a context handle. Use variable length conformant arrays instead of maximum-sized fixed length arrays (for example, 1024-byte name fields sized to handle the maximum possible name). In addition, if the client connects to the server through a slow link, for example a dial-up link, it takes a lot longer to send those extra bytes across the wire.
Investigate using transmit_as to turn large complex structures into small opaque ones for faster marshalling.