I sketched some code a while ago for single bit changes which may be quicker, in the thread
http://forums.leaflabs.com/topic.php?id=737&page=2#post-25150
and forum member tlgosser developed the ideas, and very helpfully posted links for the faster single bit change at
http://forums.leaflabs.com/topic.php?id=11844
The ports on Maple's STM32F103 are 16 bits wide, and can be read and written 16 bits at a time.
We had a thread about a year ago experimenting with that. The documentation is the ST Micro manual 'RM0008' explains it all in detail (Chapter 9 "General-purpose and alternate-function I/Os (GPIOs and AFIOs)")
Essentially every GPIO port has a bunch of registers, with a wider range of capabilities than the Arduino's ATMega.
Every GPIO port has 16bit wide input register and output register, so the whole port can be read or written in one access (2 cycles). The direction of the port's pins is set using two "Port configuration registers", which supports a bit more than INPUT and OUTPUT.
Every GPIO port has a register called "Port bit reset register (GPIOx_BRR) (x=A..G)" which can be used to clear any subset of the 16 pins to 0. Write a bit pattern with 1 bits in every pin position you want to clear is written to that register for the port.
Further, every GPIO port has a register called "Port bit set/reset register (GPIOx_BSRR) (x=A..G)" which can be used to simultaneously clear a subset of the 16 pins to 0, and set a different subset of the ports 16 pins to 1.
One bits in the top 16 bits of a 32 bit word clear the corresponding port pin to 0, and ones in the lower 16 bits of the 32 bit word set the corresponding port pin to 1. Zero bits don't effect a pin.
Some ports have fewer than 16 pins connected. You'll need to check the ST Micro datasheet for the STM32F103xB for the exact pin mapping.