Sorry if that was a bit complicated. I guess "out-of-the-box" windows has a lot of "zero-config" power monitoring and control features, whereas on linux you can achieve the same (even more really because its more configurable) but it takes a bit more work.
1) Ensure you CPU is throttling correctly and using the ondemand governor - use something like the cpu frequency applet for gnome to set and monitor it.
2) Ensure your graphics card is doing the same, if for instance it's an ATI card then it will have different "powerstates" that can be set by the driver.
3) Ensure things like screen backlight are set dimmer when on battery power.
4) Install powertop and experiment with what it suggests
5) Take a look at lesswatts.org and follow some of their tips
6) Search for some threads on here - there are many threads about power saving
Oh, and heres a bash script I found somewhere that you can use while the battery is discharging to keep an eye on temperature, discharge rate and cpu frequency...
Code:
#!/bin/bash
# Display CPU frequency, temperature and current drawn from the battery
#in (almost) real time
TAlpha=0.99900 # Coeficient used to compute the temperature average
# Keep it in the ]0..1[ range.
# Increase it to have a more smooth temperature average
# And keep the trailing 0 it is important
IAlpha=0.950 # Same as above but for the current
SamplingPeriod=1
DisplayPeriod=10
TempUnit="°C"
echo "Sampling period: $SamplingPeriod s"
echo "Temperature average coefficient: $TAlpha"
echo "Current average coefficient: $IAlpha"
# Variables initialization
TAvg=`acpi -t -B | cut --delimiter=" " --fields=9`
TMin=$TAvg
TMax=$TAvg
IAvg=`grep 'present rate:' /proc/acpi/battery/BAT1/state | cut --delimiter=" " --fields=14`
IMin=$IAvg
IMax=$IAvg
TBeta=`echo "1-$TAlpha" | bc`
IBeta=`echo "1-$IAlpha" | bc`
LastDisplay=1
# Main loop
while [ 0 ]
do
# Get temperature
T=`acpi -t -B | cut --delimiter=" " --fields=9`
# Compute temperature moving aveage
TAvg=`echo "$TAlpha * $TAvg + $TBeta * $T" | bc`
# Get current
I=`grep 'present rate:' /proc/acpi/battery/BAT1/state | cut --delimiter=" " --fields=14`
# Compute current moving average
IAvg=`echo "$IAlpha * $IAvg + $IBeta * $I" | bc`
# Comute min/max values of current display period
TMax=`echo "a=$T; b=$TMax; if (a > b) a else b" | bc`
TMin=`echo "a=$T; b=$TMin; if (a < b) a else b" | bc`
IMax=`echo "a=$I; b=$IMax; if (a > b) a else b" | bc`
IMin=`echo "a=$I; b=$IMin; if (a < b) a else b" | bc`
# Get CPU frequency
Freq=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq`
# Display data
if [ $LastDisplay -eq 1 ]; then
Timestamp=`date "+%Y/%m/%d %H:%M:%S"`
echo "$Timestamp T = $TMin/$TMax $TempUnit Avg(T) = $TAvg $TempUnit I = $IMin/$IMax mA Avg(I) = $IAvg mA F = $Freq MHz"
TMax=$T
TMin=$T
IMin=$I
IMax=$I
fi
# Wait until next sampling period
sleep $SamplingPeriod
LastDisplay=$(($LastDisplay+$SamplingPeriod))
if [ $DisplayPeriod -le $LastDisplay ]; then
LastDisplay=1
fi
done