Watcom C++ y Sieve para DOS

Hace unos años redacté Sieve en C, una macro-comparativa del rendimiento de diferentes compiladores de C/C++ para Windows ejecutando una implementación de la Criba de Eratóstenes o Sieve. Unos días atrás publiqué Visual C++ 2008 vs Visual C++ 2017, y volvió a picarme el gusanillo sobre lo que ha evolucionado la calidad del código generado por los compiladores.

A ello se ha sumado el anuncio por parte de Walter Bright que DigitalMars C++ es ahora código libre. DigitalMars es la continuación del clásico Symantec C++, y a su vez del legendario Zortech C++.


Watcom C++ y Sieve para DOS

El proceso ha sido bastante sencillo. He partido de mi experiencia con MEMTRACE para así tener una base multi-plataforma y multi-compilador, y entonces he generado los diferentes ejecutables de Sieve. La única dificultad ha sido que no todos los compiladores funcionaban sobre Windows, de manera que hay dos cadenas de compilación: builddos (Borland y Microsoft) y buildwin para el resto (Watcom, OpenWatcom y DigitalMars).

Como también quería verificar el grado de evolución de los compiladores, cuando ha sido posible he incluido diferentes versiones. Por ejemplo Borland C++ 3.1 de 1991 y Borland C++ 5.02 de 1997 o Watcom C++ 11.0 de 1997 y OpenWatcom C++ 2.0 beta de 2018.

Para los que vivisteis esa época, recordaréis lo complicado que era obtener software. La mayoría de programadores aficionados y muchos profesionales usábamos Turbo C y sus sucesores. Unos pocos, usaban Microsoft C Compiler una estupenda herramienta que nunca llegó a tener un buen IDE. Sabíamos que Borland no era el mejor producto ni de lejos. La calidad de su código, que empezó siendo excelente, fue quedándose estancada con el paso del tiempo. A su favor tenía que era fácil de conseguir, casi omnipresente, que tenía un IDE estupendo, y que se acompañaba de una completísima ayuda en linea.

Era la década de 1990, no había aparecido DJGPP y lo poco que existía de GCC era para Linux. Sin embargo, siempre hubo un producto que estuvo en mi mente: Watcom C++. Una herramienta carísima, pero que permitía compilación cruzada. Se ejecutaba sobre DOS, Windows u OS/2, y generaba programas compatibles con esas plataformas además de Novell. Imaginaros lo que aquello representaba en esa época. Desde un modesto equipo corriendo sobre MS-DOS, era posible desarrollar y compilar para Windows y viceversa.

Pero Watcom tenía otra cosa mucho más atractiva. Y es que era el líder en cuanto a rendimiento de sus programas. Combinado con el extensor DOS/4GW, era la herramienta que veíamos en software comercial de máximo nivel, sobre todo en juegos (Doom, Quake, …). Las malas lenguas decía que la propia IBM había probado convertir parte del código de OS/2 a Watcom, y habían conseguido un 50% de mejoría.

Sea como fuere, cuando logré hacerme con Watcom C++ 9.5, y un equipo suficientemente potente para ejecutarlo, ya había pasado demasiado tiempo, lo cual no impidió que me hiciera un gran fan de él, y que como sabéis, haya colaborado y apoyado el desarrollo del mismo desde que se hiciera libre. En aquel momento me decepcionó la falta de un IDE para DOS

Para las versiones de 32 bits para DOS es obligatorio el uso de un extensor DOS. En DigitalMars he utilizado FlashTek que es el que trae de serie. Para Watcom/OpenWatcom, aunque me iba a decantar por DOS32A, finalmente escogí el reducido PMODE/WI.

Estos han sido los resultados:

Compilador Plataforma Tamaño ejecutable (bytes) Tiempo de ejecución (ms)
Borland C++ 3.1 DOS 16 7.064 5.166
Borland C++ 5.02 DOS 16 34.392 5.770
Visual C++ 1.52 (Microsoft C++ Compiler 8.0) DOS 16 8.637 4.720
Watcom C++ 11.0c DOS 16 17.390 6.124
OpenWatcom C++ 2.0 beta DOS 16 9.148 6.036
Watcom C++ 11.0c DOS 32 44.856 6.087
OpenWatcom C++ 2.0 beta DOS 32 27.780 5.913
DigitalMars C++ 8.57 DOS 16 13.628 6.480
DigitalMars C++ 8.57 DOS 32 31.585 6.150

Podemos apreciar que la mejoría del 50% no es tal. Soy el primero en defender a Watcom y conozco bien los detalles del código que genera. Se que es de estupenda calidad, pero como siempre, esas ventajas se obtienen en casos concretos, especialmente cuando se pueden hacer accesos de 32 bits. Ello quiere decir que en general, es necesario ajustar ciertas partes del código para obtener ese elevado beneficio. Si nos ponemos en el contexto de los juegos, con enormes accesos a la memoria gráfica, es ahí en donde el modo protegido de Watcom brillaría.

Lo que sorprende es que el “odiado” Borland C++ 3.1 acaba siendo el líder. Sus ejecutables son los más ligeros, y también los más rápidos. Cuando hablamos de programas sencillos, cuanta menos complejidad tenga el compilador y su librería, mucho mejor. El ejemplo se ve claramente al compararlo con su sucesor, Borland C++ 5.02, el ejecutable es mucho más grande debido a las nuevas librerías, u además también más lento. Esto nos recuerda aquellos tiempos oscuros de Borland.

Otra cosa que me gusta es el avance que ha tenido Watcom desde haberse convertido en un proyecto libre con OpenWatcom. Los ejecutables son más pequeños gracias a la mayor segregación de funciones de la librería. Pero además, son también algo más rápidos. Un aspecto en el que he contribuido ligeramente, pero del que hay que agradecer sobre todo a Jiří Malák y Michael Necasek.

Se confirma lo que explicaba al principio con Microsoft C Compiler, pese a algunos bugs en el generador de código, en modo de 16 bits solía ser el más eficiente. Recuerdo cuando probé las versión 6.00 que me dejó impresionado en ese sentido. Finalmente, no puedo omitir a DigitalMars, tan poco conocido en Europa que no fue hasta que fuera código libre que tuviera la oportunidad de probarlo y de darme cuenta de todo lo que me había perdido.

Por otro lado, tengo algunas dudas acerca de la emulación que realiza DOSBox, por lo que los tiempos deben tomarse con cautela.

Me da un poco de vergüenza poner el código aquí, porque es una conversión rápida del que tenía hecho en Javascript, pero no importa:

#include 
#include 
#include 


#define ITER 1000

void main(void)
{
	register unsigned int k,i;
	unsigned int iter, count;
	static unsigned char flags[ITER];
	clock_t start, end;
	unsigned long t;

	start=clock();
	for(iter=1; iter<=ITER; iter++)
	{
		count=0;
		for(i=0; i<=ITER; i++)
		{
			flags[i]=0;
		}
		for(i=2; i<=ITER; i++)
		{
			if (flags[i]==0)	/* found a prime */
			{
				count++;	
				for (k=i+i; k<=ITER; k+=i)
				{
					flags[k]=1;
				}
			}
		}
	}
	end=clock();
	t=(long)(end-start)*1000/(int)CLOCKS_PER_SEC;
	printf("%d iterations %d primes found, %ld ms.", ITER, count, t);
}

Como siempre, te dejo un paquetito con el código fuente y todos los binarios por si quieres probarlo aquí (107 Kb. en formato ZIP).

8 comentarios en “Watcom C++ y Sieve para DOS”

  1. aunque tus tablas no se ven en el navegador (supomgo que sera cuestion de css), y que como ya tu sabes de C como que me ralla (¿O es raya?, jope nunca me acuerdo :D) se agradece el currazo.

    El codigo para nada me parece vergonzoso, cuando estudiaba creo que una de mis profesoras (yolanda, un saludo ;D) decia que mientras no apareciese un break, un bucle no estaba mal hecho 🙂 -luego esta la cosa del volcado de pila, eso ya aparte XD-.

  2. Javier Gutiérrez Chamorro (Guti)

    Muy raro cadenacuatro.com porque incluso en el viejo Opera 12 yo veo la tabla. Jaja, lo de la raya y la ralla es algo que tampoco tengo nunca claro. Sólo se que el queso, es rallado, pero porque lo veo en el paquete. De los otros, siempre tengo dudas.

    Bueno, hay profesionales y profesores que tienen un nivel de exigencia digamos… bajo. El código, si debe ser visible por los demás, tiene que ser lo más pulcro posible. Como un libro o un relato. Al menos así lo veo yo. Por eso cuando pienso que no está a la altura, creo que es honesto advertir. Nadie es perfecto, ni tenemos todo el tiempo que nos gustaría.

  3. Javier Gutiérrez Chamorro (Guti)

    Debe hacer literalmente décadas que no uso Dev-CPP Fernando. Lo que llama la atención es la tendencia, cada vez ejecutables más grandes, pero también más rápidos. Claro que no es lo mismo comparar la ejecución DOS en una máquina virtual con una Windows nativa, pero no me cabe duda que GCC 9.2 generará un código bastante mejor que el de Watcom. Ironías de la vida, no hace tampoco demasiado que IBM y Microsoft iban detrás de Watcom por generar mejores ejecutables que los suyos.

    Recuerdo un rumor que decía que IBM llegó a compilar alguna versión de OS/2 con Watcom, y que el aumento de rendimiento era notable.

  4. El c de microsoft tenía un editor raro, los compiladores de ST por ejemplo tenían editores mejores , borland con turbo visión y el IDE no estaban mal, pero tenía cosas distintas del ansic como la conio o bgi, watcom lo use poco, pero es cierto que rendía de maravilla en modo protegido del 386 con el extensor y código de 32 bits, muy compacto.

  5. Javier Gutiérrez Chamorro (Guti)

    Bienvenido Mordamir. Realmente la plataforma DOS en modo texto poco tenía que hacer en cuanto a presentación y usabilidad comparado con ST y Amiga. Su punto fuerte era la capacidad de proceso.

Deja un comentario