* Buffer writes in FdSink. This significantly reduces the number of
system calls / context switches when dumping a NAR and in the worker protocol.
This commit is contained in:
		
							parent
							
								
									893cac1402
								
							
						
					
					
						commit
						3a48282b06
					
				
					 4 changed files with 51 additions and 15 deletions
				
			
		|  | @ -9,7 +9,30 @@ namespace nix { | |||
| 
 | ||||
| void FdSink::operator () (const unsigned char * data, unsigned int len) | ||||
| { | ||||
|     writeFull(fd, data, len); | ||||
|     if (!buffer) buffer = new unsigned char[bufSize]; | ||||
|      | ||||
|     while (len) { | ||||
|         /* Optimisation: bypass the buffer if the data exceeds the
 | ||||
|            buffer size and there is no unflushed data. */ | ||||
|         if (bufPos == 0 && len >= bufSize) { | ||||
|             writeFull(fd, data, len); | ||||
|             break; | ||||
|         } | ||||
|         /* Otherwise, copy the bytes to the buffer.  Flush the buffer
 | ||||
|            when it's full. */ | ||||
|         size_t n = bufPos + len > bufSize ? bufSize - bufPos : len; | ||||
|         memcpy(buffer + bufPos, data, n); | ||||
|         data += n; bufPos += n; len -= n; | ||||
|         if (bufPos == bufSize) flush(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void FdSink::flush() | ||||
| { | ||||
|     if (fd == -1 || bufPos == 0) return; | ||||
|     writeFull(fd, buffer, bufPos); | ||||
|     bufPos = 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue