forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			107 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Test01.cpp
 | |
| 
 | |
| #include "nsINode.h"
 | |
| #include "nsCOMPtr.h"
 | |
| #include "nsString.h"
 | |
| 
 | |
| NS_DEF_PTR(nsINode);
 | |
| 
 | |
| 	/*
 | |
| 		This test file compares the generated code size of similar functions between raw
 | |
|                 COM interface pointers (|AddRef|ing and |Release|ing by hand) and |nsCOMPtr|s.
 | |
| 
 | |
| 		Function size results were determined by examining dissassembly of the generated code.
 | |
| 		mXXX is the size of the generated code on the Macintosh.  wXXX is the size on Windows.
 | |
| 		For these tests, all reasonable optimizations were enabled and exceptions were
 | |
| 		disabled (just as we build for release).
 | |
| 
 | |
| 		The tests in this file explore only the simplest functionality: assigning a pointer
 | |
|                 to be reference counted into a [raw, nsCOMPtr] object; ensuring that it is
 | |
| 		|AddRef|ed and |Release|d appropriately; calling through the pointer to a function
 | |
| 		supplied by the underlying COM interface.
 | |
| 
 | |
| 		Windows:
 | |
| 			raw_optimized														 31 bytes
 | |
| 			raw, nsCOMPtr*													 34
 | |
| 			nsCOMPtr_optimized*											 38
 | |
| 			nsCOMPtr_optimized											 42
 | |
| 			nsCOMPtr																 46
 | |
| 
 | |
| 		Macintosh:
 | |
| 			raw_optimized, nsCOMPtr_optimized				112 bytes 	(1.0000)
 | |
| 			nsCOMPtr																120					(1.0714)	i.e., 7.14% bigger than raw_optimized et al
 | |
| 			raw																			140 				(1.2500)
 | |
| 
 | |
| 		The overall difference in size between Windows and Macintosh is caused by the
 | |
| 		the PowerPC RISC architecture where every instruction is 4 bytes.
 | |
| 
 | |
|                 On Macintosh, nsCOMPtr generates out-of-line destructors which are
 | |
| 		not referenced, and which can be stripped by the linker.
 | |
| 	*/
 | |
| 
 | |
| void
 | |
| Test01_raw( nsINode* aDOMNode, nsString* aResult )
 | |
| 		// m140, w34
 | |
| 	{
 | |
| 			/*
 | |
| 				This test is designed to be more like a typical large function where,
 | |
| 				because you are working with several resources, you don't just return when
 | |
| 				one of them is |nullptr|.  Similarly: |Test01_nsCOMPtr00|, and |Test01_nsIPtr00|.
 | |
| 			*/
 | |
| 
 | |
| 		nsINode* node = aDOMNode;
 | |
| 		NS_IF_ADDREF(node);
 | |
| 
 | |
| 		if ( node )
 | |
| 			node->GetNodeName(*aResult);
 | |
| 
 | |
| 		NS_IF_RELEASE(node);
 | |
| 	}
 | |
| 
 | |
| void
 | |
| Test01_raw_optimized( nsINode* aDOMNode, nsString* aResult )
 | |
| 		// m112, w31
 | |
| 	{
 | |
| 			/*
 | |
| 				This test simulates smaller functions where you _do_ just return
 | |
| 				|nullptr| at the first sign of trouble.  Similarly: |Test01_nsCOMPtr01|,
 | |
| 				and |Test01_nsIPtr01|.
 | |
| 			*/
 | |
| 
 | |
| 			/*
 | |
| 				This test produces smaller code that |Test01_raw| because it avoids
 | |
| 				the three tests: |NS_IF_...|, and |if ( node )|.
 | |
| 			*/
 | |
| 
 | |
| // -- the following code is assumed, but is commented out so we compare only
 | |
| //		 the relevent generated code
 | |
| 
 | |
| //		if ( !aDOMNode )
 | |
| //			return;
 | |
| 
 | |
| 		nsINode* node = aDOMNode;
 | |
| 		NS_ADDREF(node);
 | |
| 		node->GetNodeName(*aResult);
 | |
| 		NS_RELEASE(node);
 | |
| 	}
 | |
| 
 | |
| void
 | |
| Test01_nsCOMPtr( nsINode* aDOMNode, nsString* aResult )
 | |
| 		// m120, w46/34
 | |
| 	{
 | |
| 		nsCOMPtr<nsINode> node = aDOMNode;
 | |
| 
 | |
| 		if ( node )
 | |
| 			node->GetNodeName(*aResult);
 | |
| 	}
 | |
| 
 | |
| void
 | |
| Test01_nsCOMPtr_optimized( nsINode* aDOMNode, nsString* aResult )
 | |
| 		// m112, w42/38
 | |
| 	{
 | |
| //		if ( !aDOMNode )
 | |
| //			return;
 | |
| 
 | |
| 		nsCOMPtr<nsINode> node = aDOMNode;
 | |
| 		node->GetNodeName(*aResult);
 | |
| 	}
 | 
