The PowerTOP program can help you determine where your battery life is going. It measures CPU wakeups, which drag the CPU out of low-power states, and assigns fault for the wakeup to specific programs. It's an amazing tool for software authors to improve their programs and for system administrators to find out why their data centers are so hot, or for individual users to find out how to improve their battery life.
I've been running it while writing this answer, and the top few lines of output look like this:
PowerTOP version 1.13 (C) 2007 Intel Corporation
Cn Avg residency P-states (frequencies)
C0 (cpu running) ( 6.1%) 2.80 Ghz 11.3%
polling 5.5ms ( 0.0%) 2.67 Ghz 0.4%
C1 mwait 0.2ms ( 0.1%) 2.00 Ghz 0.3%
C2 mwait 0.9ms ( 2.5%) 1.73 Ghz 0.4%
C3 mwait 4.2ms (91.2%) 1.60 Ghz 86.5%
Wakeups-from-idle per second : 246.3 interval: 15.0s
no ACPI power usage estimate available
Top causes for wakeups:
39.3% (290.2) [extra timer interrupt]
19.4% (143.3) npviewer.bin
7.1% ( 52.7)D firefox
8.0% ( 58.9) kworker/0:1
6.4% ( 46.9) [hda_intel] <interrupt>
4.6% ( 33.8) [kernel scheduler] Load balancing tick
4.1% ( 30.6) Xorg
2.3% ( 17.3) [radeon] <interrupt>
2.3% ( 16.7) USB device 1-5.2.2 : Apple Keyboard (Apple, Inc)
2.2% ( 16.5) [ehci_hcd:usb1, uhci_hcd:usb5, uhci_hcd:usb8, pata_jmicron, firewire_ohci] <interr
This is telling me that firefox and plugins account for 27% of my CPU wakeups; not a surprise, I'm streaming Pandora, and all they've got is some horrid Flash interface that eats a few watts for breakfast every morning.
Once you find what is eating your power, start looking for polling operations that can be converted into event-based operations. The Linux distributions have done a fair amount of work finding horrible polling interfaces and replacing them with event-based interfaces, but perhaps you're running something that hasn't yet been converted.