Smoke Testing:
Smoke Testing is performed to ascertain that the critical functionality of the program is working fine.
The objective of this testing is to verify the "stability" of the system in order to proceed with more rigorous testing.
This testing is performed by the developers or testers.
Smoke testing is usually documented or scripted.
Smoke testing is a subset of Regression testing.
Smoke testing exercises the entire system from end to end
Sanity Testing:
Sanity Testing is done to check the new functionality / bugs have been fixed.
The objective of the testing is to verify the "rationality" of the system in order to proceed with more rigorous testing
Sanity testing is usually performed by testers.
Sanity testing is usually not documented and is unscripted.
Sanity testing is a subset of Acceptance testing.
Sanity testing exercises only the particular component of the entire system.