mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-31 08:51:55 +00:00 
			
		
		
		
	llama : fix time complexity of string replacement (#9163)
This change fixes a bug where replacing text in a very long string could cause llama.cpp to hang indefinitely. This is because the algorithm used was quadratic, due to memmove() when s.replace() is called in a loop. It seems most search results and LLM responses actually provide the O(n**2) algorithm, which is a great tragedy. Using a builder string fixes things
This commit is contained in:
		| @@ -31,11 +31,17 @@ void llama_log_callback_default(ggml_log_level level, const char * text, void * | ||||
|  | ||||
| static void replace_all(std::string & s, const std::string & search, const std::string & replace) { | ||||
|     if (search.empty()) { | ||||
|         return; // Avoid infinite loop if 'search' is an empty string | ||||
|         return; | ||||
|     } | ||||
|     std::string builder; | ||||
|     builder.reserve(s.length()); | ||||
|     size_t pos = 0; | ||||
|     while ((pos = s.find(search, pos)) != std::string::npos) { | ||||
|         s.replace(pos, search.length(), replace); | ||||
|         pos += replace.length(); | ||||
|     size_t last_pos = 0; | ||||
|     while ((pos = s.find(search, last_pos)) != std::string::npos) { | ||||
|         builder.append(s, last_pos, pos - last_pos); | ||||
|         builder.append(replace); | ||||
|         last_pos = pos + search.length(); | ||||
|     } | ||||
|     builder.append(s, last_pos, std::string::npos); | ||||
|     s = std::move(builder); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Justine Tunney
					Justine Tunney