Branch prediction optimizations.
author <brian@233.sub-75-221-160.myvzw.com> <>
Fri, 7 Mar 2008 16:20:40 +0000 (11:20 -0500)
committer <brian@233.sub-75-221-160.myvzw.com> <>
Fri, 7 Mar 2008 16:20:40 +0000 (11:20 -0500)
ChangeLog
lib/common.h
lib/memcached_auto.c
lib/memcached_connect.c
lib/memcached_delete.c
lib/memcached_flush.c
lib/memcached_storage.c
lib/memcached_verbosity.c
tests/test.c

index 9f77a0efdb0c473eb44a3aa395c673c0946c06bd..c68ade0f4155f8d5d629dfbb6561639479687f97 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@
   * MEMCACHED_HASH_MURMUR added for murmur algorithm provided.
   * MEMCACHED_BEHAVIOR_RETRY_TIMEOUT added to keep connecting from looping
     on timeout.
+  * gcc branch prediction optimizations
 
 0.17 Wed Feb 27 03:33:29 PST 2008
   * MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT added for connect timeout in
index c126b5d1f5fea4e1869fcba1595eb65d1911c79b..a70e65f3f89af1be4420401d5ca5d6ea58f5bc28 100644 (file)
 
 #include <libmemcached_config.h>
 
+#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
+#define __builtin_expect(x, expected_value) (x)
+
+#define likely(x)       __builtin_expect((x),1)
+#define unlikely(x)     __builtin_expect((x),0)
+
+#else
+
+#define likely(x)       if((x))
+#define unlikely(x)     if((x))
+
+#endif
+
 #ifdef HAVE_DTRACE
 #define _DTRACE_VERSION 1
 #else
index 0d0fc91797141d32a50b934613a921d970773a7a..a607ed66e23298881c2ee5bfd6d3ea429aafbb62 100644 (file)
@@ -11,10 +11,10 @@ static memcached_return memcached_auto(memcached_st *ptr,
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   unsigned int server_key;
 
-  if (key_length == 0)
+  unlikely (key_length == 0)
     return MEMCACHED_NO_KEY_PROVIDED;
 
-  if (ptr->hosts == NULL || ptr->number_of_hosts == 0)
+  unlikely (ptr->hosts == NULL || ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
   if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
@@ -26,7 +26,7 @@ static memcached_return memcached_auto(memcached_st *ptr,
                         "%s %.*s %u\r\n", verb, 
                         (int)key_length, key,
                         offset);
-  if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+  unlikely (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
     return MEMCACHED_WRITE_FAILURE;
 
   rc= memcached_do(&ptr->hosts[server_key], buffer, send_length, 1);
index dc86d1e12727567f6b93824429a146dbad66f601..ab4b84f0936d588cac7fe7671d25647742727809 100644 (file)
@@ -102,7 +102,7 @@ static memcached_return set_socket_options(memcached_server_st *ptr)
     int flags;
 
     flags= fcntl(ptr->fd, F_GETFL, 0);
-    if (flags != -1)
+    unlikely (flags != -1)
     {
       (void)fcntl(ptr->fd, F_SETFL, flags | O_NONBLOCK);
     }
index b3ae560d14253bceaac1b7719ed821b40aca0e74..60e3bed4406e3ce89c1b6c64868559af8f77b7b8 100644 (file)
@@ -20,10 +20,10 @@ memcached_return memcached_delete_by_key(memcached_st *ptr,
 
   LIBMEMCACHED_MEMCACHED_DELETE_START();
 
-  if (key_length == 0)
+  unlikely (key_length == 0)
     return MEMCACHED_NO_KEY_PROVIDED;
 
-  if (ptr->hosts == NULL || ptr->number_of_hosts == 0)
+  unlikely (ptr->hosts == NULL || ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
   server_key= memcached_generate_hash(ptr, master_key, master_key_length);
index fa3dd8d8973eb9de56b925eea2177a973586aa7c..1511adbe43ce0913f09cd1c9ee335e280e4b4db9 100644 (file)
@@ -8,7 +8,7 @@ memcached_return memcached_flush(memcached_st *ptr, time_t expiration)
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   LIBMEMCACHED_MEMCACHED_FLUSH_START();
 
-  if (ptr->number_of_hosts == 0)
+  unlikely (ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
   for (x= 0; x < ptr->number_of_hosts; x++)
index 6d115913ebd0d213784c9cf108c23b3e6f6aace3..fb3e6b2bc8027a64658c337e50ec807fe7c36af3 100644 (file)
@@ -60,10 +60,10 @@ static inline memcached_return memcached_send(memcached_st *ptr,
   WATCHPOINT_ASSERT(!(value == NULL && value_length > 0));
   WATCHPOINT_ASSERT(!(value && value_length == 0));
 
-  if (key_length == 0)
+  unlikely (key_length == 0)
     return MEMCACHED_NO_KEY_PROVIDED;
 
-  if (ptr->number_of_hosts == 0)
+  unlikely (ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
   if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
index f599787bd070697c011bf566224b210348b33e34..7cfb073fdcd69799a703f88f61ee6519fc137aba 100644 (file)
@@ -9,7 +9,7 @@ memcached_return memcached_verbosity(memcached_st *ptr, unsigned int verbosity)
 
   send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
                         "verbosity %u\r\n", verbosity);
-  if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+  unlikely (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
     return MEMCACHED_WRITE_FAILURE;
 
   rc= MEMCACHED_SUCCESS;
index 6c6bea645c4da1376069b70ef387e48a97447ccf..998b25f1158e32b2d5b4884cbcf512ba065e9587 100644 (file)
@@ -45,6 +45,8 @@ int main(int argc, char *argv[])
 
   if (world.create)
     world_ptr= world.create();
+  else 
+    world_ptr= NULL;
 
   startup_ptr= (server_startup_st *)world_ptr;
   servers= (memcached_server_st *)startup_ptr->servers;