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!

Preguntas similare

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!
Respuesta Responder a este mensaje
#2 Tako
28/11/2004 - 20:21 | Informe spam
Will wrote:
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!



Pues segun para lo que lo necesites te puede servir esto: simplemente en
lugar de hacer una sola lectura haces unas cuantas (muchas) de ellas.

Con esto no conseguiras un tiempo real de lo que tarda pero si podrás
hacer comparativas.

Espero que te sirva la idea.
Respuesta Responder a este mensaje
#3 Juan
29/11/2004 - 12:47 | Informe spam
Puedes hacerlo que comentan acerca d emultiplicar el numero de bytes leidos
y escritos, y luego hacer una sencilla regla de tres, aunque también puedes
utilizar System.datetime.now.ticks, que nos convierte la fecha y hora actual
al número de nanosegundos que han pasado desde una fecha inicial (no
recuerdo si era el 1/1/1970)
Es un valor long:

long antes = Datetime.now.tick;

//operacion a realizar

long resultado = (antes- datetime.now.ticks) /10000

La division entre 10000 es para convertir a milisegundos. Si quieres mas
precision no lo dividas, y haces el calculo en nanosegundos.

Saludos


"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...

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!
Respuesta Responder a este mensaje
#4 Zephryn Xirdal
29/11/2004 - 15:33 | Informe spam
La resolución de ticks es de de 100 nanosegundos.

De todos modos yo sigo reiterando lo que he dicho en un post anterior.


"Juan" escribió en el mensaje
news:
Puedes hacerlo que comentan acerca d emultiplicar el numero de bytes
leidos y escritos, y luego hacer una sencilla regla de tres, aunque
también puedes utilizar System.datetime.now.ticks, que nos convierte la
fecha y hora actual al número de nanosegundos que han pasado desde una
fecha inicial (no recuerdo si era el 1/1/1970)
Es un valor long:

long antes = Datetime.now.tick;

//operacion a realizar

long resultado = (antes- datetime.now.ticks) /10000

La division entre 10000 es para convertir a milisegundos. Si quieres mas
precision no lo dividas, y haces el calculo en nanosegundos.

Saludos


"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...

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!




email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida