I've done some tests with gcc, which has an option to show the time taken by each subprocess in the compilation sequence. Results and test program are below. The file log2_impl.hpp contained either the trivial implementation I've posted before, or Vesa's one, or a simple #include "boost/static_log2.hpp". In the case of Vesa's implementation I avoided inclusion of <climits> by simple replacing
sizeof(unsigned long) * CHAR_BIT / 2 with the literal 16. Results are: - trivial $ g++ -I"...boost_1_29_0" -time log.cpp # cc1plus 0.49 0.61 # as 0.04 0.09 # collect2 0.36 1.24 -vesa $ g++ -I"...boost_1_29_0" -time log.cpp # cc1plus 0.71 0.71 # as 0.05 0.07 # collect2 0.37 1.43 - boost::static_log2 $ g++ -I"...boost_1_29_0" -time log.cpp # cc1plus 3.14 0.91 # as 0.05 0.07 # collect2 0.41 1.29 ------ Test program #include "log2_impl.hpp" #include "boost/static_assert.hpp" //#define log2 boost::static_log2 #define BOOST_INT_CONST_LOG2_TEST(val, result) \ BOOST_STATIC_ASSERT( log2<val>::value == result) #ifdef BOOST_INT_CONST_LOG2_TEST_FOR_ZERO enum { dummy = log2<0>::value }; // should give an error #endif int main() { // Test on 2**n and 2**n - 1 BOOST_INT_CONST_LOG2_TEST(1, 0); BOOST_INT_CONST_LOG2_TEST(2, 1); BOOST_INT_CONST_LOG2_TEST(3, 1); BOOST_INT_CONST_LOG2_TEST(4, 2); BOOST_INT_CONST_LOG2_TEST(7, 2); BOOST_INT_CONST_LOG2_TEST(8, 3); BOOST_INT_CONST_LOG2_TEST(15, 3); BOOST_INT_CONST_LOG2_TEST(16, 4); BOOST_INT_CONST_LOG2_TEST(31, 4); BOOST_INT_CONST_LOG2_TEST(32, 5); BOOST_INT_CONST_LOG2_TEST(63, 5); BOOST_INT_CONST_LOG2_TEST(64, 6); BOOST_INT_CONST_LOG2_TEST(127, 6); BOOST_INT_CONST_LOG2_TEST(128, 7); BOOST_INT_CONST_LOG2_TEST(255, 7); BOOST_INT_CONST_LOG2_TEST(256, 8); BOOST_INT_CONST_LOG2_TEST(511, 8); BOOST_INT_CONST_LOG2_TEST(512, 9); BOOST_INT_CONST_LOG2_TEST(1023, 9); BOOST_INT_CONST_LOG2_TEST(1024, 10); BOOST_INT_CONST_LOG2_TEST(2047, 10); BOOST_INT_CONST_LOG2_TEST(2048, 11); BOOST_INT_CONST_LOG2_TEST(4095, 11); BOOST_INT_CONST_LOG2_TEST(4096, 12); BOOST_INT_CONST_LOG2_TEST(8191, 12); BOOST_INT_CONST_LOG2_TEST(8192, 13); BOOST_INT_CONST_LOG2_TEST(16383, 13); BOOST_INT_CONST_LOG2_TEST(16384, 14); BOOST_INT_CONST_LOG2_TEST(32767, 14); BOOST_INT_CONST_LOG2_TEST(32768, 15); BOOST_INT_CONST_LOG2_TEST(65535, 15); BOOST_INT_CONST_LOG2_TEST(65536, 16); BOOST_INT_CONST_LOG2_TEST(131071, 16); BOOST_INT_CONST_LOG2_TEST(131072, 17); BOOST_INT_CONST_LOG2_TEST(262143, 17); BOOST_INT_CONST_LOG2_TEST(262144, 18); BOOST_INT_CONST_LOG2_TEST(524287, 18); BOOST_INT_CONST_LOG2_TEST(524288, 19); BOOST_INT_CONST_LOG2_TEST(1048575, 19); BOOST_INT_CONST_LOG2_TEST(1048576, 20); BOOST_INT_CONST_LOG2_TEST(2097151, 20); BOOST_INT_CONST_LOG2_TEST(2097152, 21); BOOST_INT_CONST_LOG2_TEST(4194303, 21); BOOST_INT_CONST_LOG2_TEST(4194304, 22); BOOST_INT_CONST_LOG2_TEST(8388607, 22); BOOST_INT_CONST_LOG2_TEST(8388608, 23); BOOST_INT_CONST_LOG2_TEST(16777215, 23); BOOST_INT_CONST_LOG2_TEST(16777216, 24); BOOST_INT_CONST_LOG2_TEST(33554431, 24); BOOST_INT_CONST_LOG2_TEST(33554432, 25); BOOST_INT_CONST_LOG2_TEST(67108863, 25); BOOST_INT_CONST_LOG2_TEST(67108864, 26); BOOST_INT_CONST_LOG2_TEST(134217727, 26); BOOST_INT_CONST_LOG2_TEST(134217728, 27); BOOST_INT_CONST_LOG2_TEST(268435455, 27); BOOST_INT_CONST_LOG2_TEST(268435456, 28); BOOST_INT_CONST_LOG2_TEST(536870911, 28); BOOST_INT_CONST_LOG2_TEST(536870912, 29); BOOST_INT_CONST_LOG2_TEST(1073741823, 29); BOOST_INT_CONST_LOG2_TEST(1073741824, 30); BOOST_INT_CONST_LOG2_TEST(2147483647, 30); BOOST_INT_CONST_LOG2_TEST(2147483648u, 31); BOOST_INT_CONST_LOG2_TEST(4294967295u, 31); // Ok, now test again BOOST_INT_CONST_LOG2_TEST(1, 0); BOOST_INT_CONST_LOG2_TEST(2, 1); BOOST_INT_CONST_LOG2_TEST(3, 1); BOOST_INT_CONST_LOG2_TEST(4, 2); BOOST_INT_CONST_LOG2_TEST(7, 2); BOOST_INT_CONST_LOG2_TEST(8, 3); BOOST_INT_CONST_LOG2_TEST(15, 3); BOOST_INT_CONST_LOG2_TEST(16, 4); BOOST_INT_CONST_LOG2_TEST(31, 4); BOOST_INT_CONST_LOG2_TEST(32, 5); BOOST_INT_CONST_LOG2_TEST(63, 5); BOOST_INT_CONST_LOG2_TEST(64, 6); BOOST_INT_CONST_LOG2_TEST(127, 6); BOOST_INT_CONST_LOG2_TEST(128, 7); BOOST_INT_CONST_LOG2_TEST(255, 7); BOOST_INT_CONST_LOG2_TEST(256, 8); BOOST_INT_CONST_LOG2_TEST(511, 8); BOOST_INT_CONST_LOG2_TEST(512, 9); BOOST_INT_CONST_LOG2_TEST(1023, 9); BOOST_INT_CONST_LOG2_TEST(1024, 10); BOOST_INT_CONST_LOG2_TEST(2047, 10); BOOST_INT_CONST_LOG2_TEST(2048, 11); BOOST_INT_CONST_LOG2_TEST(4095, 11); BOOST_INT_CONST_LOG2_TEST(4096, 12); BOOST_INT_CONST_LOG2_TEST(8191, 12); BOOST_INT_CONST_LOG2_TEST(8192, 13); BOOST_INT_CONST_LOG2_TEST(16383, 13); BOOST_INT_CONST_LOG2_TEST(16384, 14); BOOST_INT_CONST_LOG2_TEST(32767, 14); BOOST_INT_CONST_LOG2_TEST(32768, 15); BOOST_INT_CONST_LOG2_TEST(65535, 15); BOOST_INT_CONST_LOG2_TEST(65536, 16); BOOST_INT_CONST_LOG2_TEST(131071, 16); BOOST_INT_CONST_LOG2_TEST(131072, 17); BOOST_INT_CONST_LOG2_TEST(262143, 17); BOOST_INT_CONST_LOG2_TEST(262144, 18); BOOST_INT_CONST_LOG2_TEST(524287, 18); BOOST_INT_CONST_LOG2_TEST(524288, 19); BOOST_INT_CONST_LOG2_TEST(1048575, 19); BOOST_INT_CONST_LOG2_TEST(1048576, 20); BOOST_INT_CONST_LOG2_TEST(2097151, 20); BOOST_INT_CONST_LOG2_TEST(2097152, 21); BOOST_INT_CONST_LOG2_TEST(4194303, 21); BOOST_INT_CONST_LOG2_TEST(4194304, 22); BOOST_INT_CONST_LOG2_TEST(8388607, 22); BOOST_INT_CONST_LOG2_TEST(8388608, 23); BOOST_INT_CONST_LOG2_TEST(16777215, 23); BOOST_INT_CONST_LOG2_TEST(16777216, 24); BOOST_INT_CONST_LOG2_TEST(33554431, 24); BOOST_INT_CONST_LOG2_TEST(33554432, 25); BOOST_INT_CONST_LOG2_TEST(67108863, 25); BOOST_INT_CONST_LOG2_TEST(67108864, 26); BOOST_INT_CONST_LOG2_TEST(134217727, 26); BOOST_INT_CONST_LOG2_TEST(134217728, 27); BOOST_INT_CONST_LOG2_TEST(268435455, 27); BOOST_INT_CONST_LOG2_TEST(268435456, 28); BOOST_INT_CONST_LOG2_TEST(536870911, 28); BOOST_INT_CONST_LOG2_TEST(536870912, 29); BOOST_INT_CONST_LOG2_TEST(1073741823, 29); BOOST_INT_CONST_LOG2_TEST(1073741824, 30); BOOST_INT_CONST_LOG2_TEST(2147483647, 30); BOOST_INT_CONST_LOG2_TEST(2147483648u, 31); BOOST_INT_CONST_LOG2_TEST(4294967295u, 31); } --------------------- Genny. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost