Skip to content
Tech AI Wire

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.

Por Tech AI Wire Team

3 min de lectura

XLinkedIn
A terminal running benchcmp to compare a scalar Go benchmark against a vectorised one, with the delta column showing the speed-up.

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.

MedidaResultado
Codificación popcount posicionalUnas 2x más rápida con SIMD
Rendimiento en bloques completosUnas 3x más rápido que el Go escalar
Frente a la biblioteca en C originalEmpate, codificador y decodificador
Dependencias de cgo restantesNinguna

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

  1. Debian Code Search: Fast TurboPFor with Go SIMD - Michael Stapelberg
  2. Debian Code Search - Debian
  3. stapelberg/goturbopfor - GitHub

Artículos relacionados

A terminal showing a large C++ project compiling, with the CMake percentage counter partway through and object files scrolling past.
Coding

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.