Problema con DateTime.Now

28/11/2004 - 15:05 por Will | Informe spam
Hola

Tengo el siguiente problema:
Necesito hacer un pequeño programa para benchmarking de memoria, y entre
las pruebas que tengo que hacer dice que debo sacar el tiempo que se
tarda en escribir y leer de memoria 4 bytes, se supone que el tiempo lo
debo tomar solamente de la lectura/escritura de memoria.

El problema es que si hago algo como:

DateTime inicio;
DateTime final;

inicio = DateTime.Now;

for (i = 0; i < cantidadBytes; i++)
datos[i] = 127;

fin = DateTime.Now

suponiendo que cantidadBytes son los bytes que tengo que leer...
me pasa que inicio == fin == 0 !!!

y no se por que...

tal vez alguien me pueda dar una pista...
también he pensado en escalar el ciclo, y luego dividir, el problema es
que en el tiempo que mido introduciría los tiempos de los ciclos y no me
serviría,
lo que estoy haciendo es tomando el tiempo escalado y le resto el tiempo
de otro ciclo igual pero sin el acceso a memoria que necesito medir, así
se supone que me da el dato correcto, pero la verdad no me parece la
mejor salida...

Se agradece cualquier idea!
 

Leer las respuestas

#1 Zephryn Xirdal
28/11/2004 - 16:10 | Informe spam
"Will" escribió en el mensaje
news:cocluk$p7n$
Hola

Tengo el siguiente problema:
Necesito hacer un pequeño programa para benchmarking de memoria, y entre
las pruebas que tengo que hacer dice que debo sacar el tiempo que se tarda
en escribir y leer de memoria 4 bytes, se supone que el tiempo lo debo
tomar solamente de la lectura/escritura de memoria.

El problema es que si hago algo como:

DateTime inicio;
DateTime final;

inicio = DateTime.Now;

for (i = 0; i < cantidadBytes; i++)
datos[i] = 127;

fin = DateTime.Now

suponiendo que cantidadBytes son los bytes que tengo que leer...
me pasa que inicio == fin == 0 !!!

y no se por que...




Pues porque el tiempo de escritura es menor que la resolución del reloj que
se usa.

tal vez alguien me pueda dar una pista...
también he pensado en escalar el ciclo, y luego dividir, el problema es
que en el tiempo que mido introduciría los tiempos de los ciclos y no me
serviría,


Lo que puedes hacer es realizarlo en ensamblador, y luego descontar los
tiempos de ejecución de las instrucciones que no sean las necesarias. Una
forma es mirarte el juego de instrucciones y ver cuántos ciclos de reloj
necesitan, y con la frecuencia del micro tendrías algo, salvo que... como en
Windows todo está virtualizado, lo más seguro es que mientras realizas todo
el asunto te pillen varios cambios de contexto/núcleo-usuario/etc, con lo
que unas veces obtendrás un tiempo y otras otro... con la complicación de
que dependiendo de la arquitectura del micro (Intel-AMD), e incluso la
revisión del modelo, ese número de ciclos de reloj puede variar... con la
complicación de que deberías desactivar las cachés de primer y segundo
nivel, cosa que casi seguro que Windows no te deja en modo usuario (porque
si haces dos escrituras seguidad a la misma dirección de memoria una caché
medio lista no escribe (ni lee) la segunda vez)... con la complicación de
que según qué compilador, si lo haces en un lenguaje de alto nivel, el
optimizador puede que reduzca el bucle a una sóla escritura/lectura (el vc
no sé qué tal es en eso, pero el CodeWarrior para ColdFire se las pinta sólo
para reducir código a mansalva, jodiendo la marrana a veces)

lo que estoy haciendo es tomando el tiempo escalado y le resto el tiempo
de otro ciclo igual pero sin el acceso a memoria que necesito medir, así
se supone que me da el dato correcto, pero la verdad no me parece la mejor
salida...




Desde luego que no, y menos aún en C#. Hay demasiadas capas de sofware entre
tu programa y la máquina física como para que obtengas algo "estricto".


Se agradece cualquier idea!

Preguntas similares