diff --git a/src/ChangeLog b/src/ChangeLog
index 2ecdb25a6556a0ed0696e4b080ec43074e567707..38f1cb51ebd4843d805daeaf67b479fe5456741f 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+Sat Feb 15 08:30:15 1997  Fredrik Hubinette  <hubbe@cytocin.hubbe.net>
+
+	* stralloc.c (string_replace): optimized replace when to and
+	  from string are the same length.
+
 Thu Feb 13 02:56:13 1997  Niels M�ller  <nisse@infovav.se>
 
 	* operators.c (o_and, o_or, o_xor, o_compl): Added support for
diff --git a/src/stralloc.c b/src/stralloc.c
index 6a721a935c194d7476d3e40f8a71244cf7ac2087..87ba4a367dfa8143a7c9ddf29bd0816590a77426 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -505,29 +505,33 @@ struct pike_string *string_replace(struct pike_string *str,
 				     struct pike_string *to)
 {
   struct pike_string *ret;
-  INT32 delimeters;
   char *s,*tmp,*r,*end;
   struct mem_searcher searcher;
 
   s=str->str;
   end=s+str->len;
-  delimeters=0;
 
-  init_memsearch(&searcher, del->str, del->len, str->len * 2);
-
-  while((s=memory_search(&searcher,s,end-s)))
+  if(del->len == to->len)
   {
-    delimeters++;
-    s+=del->len;
-  }
+    init_memsearch(&searcher, del->str, del->len, str->len);
+    ret=begin_shared_string(str->len);
+  }else{
+    INT32 delimeters=0;
+    init_memsearch(&searcher, del->str, del->len, str->len*2);
+    while((s=memory_search(&searcher,s,end-s)))
+    {
+      delimeters++;
+      s+=del->len;
+    }
+    
+    if(!delimeters)
+    {
+      str->refs++;
+      return str;
+    }
 
-  if(!delimeters)
-  {
-    str->refs++;
-    return str;
+    ret=begin_shared_string(str->len + (to->len-del->len)*delimeters);
   }
-
-  ret=begin_shared_string(str->len + (to->len-del->len)*delimeters);
   s=str->str;
   r=ret->str;