зеркало из https://github.com/mozilla/gecko-dev.git
108 строки
3.0 KiB
C++
108 строки
3.0 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);
|
|
}
|