Debian Code Search elimina su última dependencia de cgo
Michael Stapelberg sustituyó una biblioteca en C de 7 años por Go puro usando el paquete SIMD experimental, y alcanzó la velocidad de la versión en C.
3 min de lectura

Debian Code Search ya funciona sin código C. Michael Stapelberg sustituyó una biblioteca de compresión en C de siete años por una versión en Go puro, construida sobre el paquete SIMD experimental de Go. Según informa, iguala en velocidad al original en C. "I deleted the last cgo dependency in Debian Code Search", escribió en su blog el 6 de septiembre de 2026.
Debian Code Search es el servicio que permite buscar en 130 GiB de código fuente de todos los paquetes de Debian. Lleva funcionando desde 2012.
Qué hace TurboPFor y por qué allí había C
La biblioteca en cuestión es TurboPFor. Es un formato de compresión de enteros que se usa dentro de un índice invertido para guardar listas de identificadores de documentos de forma compacta.
Ese trabajo es poco vistoso y crítico para el rendimiento. Un buscador de código pasa mucho tiempo decodificando esas listas de identificadores, así que el decodificador marca la velocidad de cada consulta.
Go puede llamar a C mediante un puente llamado cgo. Funciona, pero cuesta. Cada llamada cruza una frontera, la compilación cruzada se complica, y la compilación necesita una cadena de herramientas de C además de la de Go. Stapelberg cargó con ese trato siete años porque la versión en C era más rápida.
Qué consiguió la reescritura en Go
La reescritura se apoya en simd/archsimd, un paquete experimental que llegó con Go 1.26. SIMD significa single instruction, multiple data: una instrucción del procesador opera sobre un lote de valores en lugar de sobre uno solo.
Dos cifras del artículo destacan. La codificación popcount posicional, un paso de conteo de bits del formato, corrió unas dos veces más rápido con la ruta SIMD. Los bloques completos se decodificaron unas tres veces más rápido que la versión escalar en Go.
| Medida | Resultado |
|---|---|
| Codificación popcount posicional | Unas 2x más rápida con SIMD |
| Rendimiento en bloques completos | Unas 3x más rápido que el Go escalar |
| Frente a la biblioteca en C original | Empate, codificador y decodificador |
| Dependencias de cgo restantes | Ninguna |
Empate es la palabra importante. La versión en Go no gana a C. Empata, y eso basta para que la dependencia de C ya no compense.
La pega: sigue siendo un experimento
Esto no funciona sin más. El paquete está detrás de un indicador de compilación. Stapelberg cita el requisito directamente. "Go 1.26 introduces a new experimental simd/archsimd package", escribe, "which can be enabled by setting the environment variable GOEXPERIMENT=simd at build time."
Un paquete experimental puede cambiar de forma entre versiones, y la API aquí es deliberadamente específica de la arquitectura en vez de portable. Contamos que Go 1.27 añade un paquete simd portable junto al específico de arquitectura. Esa es la dirección, pero ninguno es estable todavía.
Qué significa esto para los desarrolladores
La lección aprovechable es que la salida de emergencia de cgo se está estrechando. Muchos proyectos en Go mantienen una dependencia de C por un bucle caliente y aceptan a cambio una compilación más difícil. Si el SIMD en Go alcanza la paridad con C escrito a mano en compresión de enteros, ese trato merece revisarse en tu propio código.
Comprueba antes qué te está costando cgo de verdad. No es solo velocidad. Son la compilación cruzada, las cadenas de herramientas de C en integración continua, el enlazado estático y la depuración tras un fallo que cruza la frontera. Lo que gana Stapelberg es una compilación más simple tanto como una más rápida.
No pongas GOEXPERIMENT=simd en una compilación de producción todavía. Experimental significa que el paquete puede moverse, y una API específica de arquitectura significa que tu código no es portable por defecto. Haz un prototipo, mide tus propias cifras y conserva la ruta de C hasta que la API se asiente.
Si quieres la implementación y no el resumen, el port a Go se publica aparte como goturbopfor. El servicio al que alimenta es de código abierto bajo la organización Debian. La lista de núcleos SIMD reales escritos en Go es corta ahora mismo, y este está en ella.
Fuentes
- Debian Code Search: Fast TurboPFor with Go SIMD - Michael Stapelberg
- Debian Code Search - Debian
- stapelberg/goturbopfor - GitHub
Artículos relacionados

Un binario strip manipulado puede colar una puerta trasera en todo NixOS
Unos investigadores han construido el ataque trusting-trust de Ken Thompson con GNU strip, no con un compilador, y han colado puertas traseras en casi todo un instalador de NixOS.

LLVM debate compilar ClangIR por defecto
Una RFC de LLVM propone compilar ClangIR dentro de Clang por defecto. Nadie lo usaría sin un indicador, pero hay estimaciones que doblan los tiempos de compilación.

Go 1.27 añade métodos genéricos y un encoding/json más rápido
Go 1.27 salió el 19 de agosto de 2026 con métodos genéricos, un motor v2 bajo encoding/json, perfiles de fugas de goroutines y firmas poscuánticas.