The "rule of thumb" is (cores + 1). However, it's very dependent on the system, and some local testing will show the optimal number. Some machines work better with more than (cores + 1). Others work better with less.
Running [cmd=]time -h make -j X buildworld[/cmd] with different values of X is quite enlightening. Especially if you put /usr/obj onto a separate filesystem and newfs it between runs (and reboot to clear out RAM).