Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Números impares desde 1 hasta 1000 (https://www.clubdelphi.com/foros/showthread.php?t=91775)

roman 24-04-2017 20:04:56

Muchas gracias jhonny. Sí que queda claro, aunque

Cita:

Empezado por jhonny
nunca encuentro es ¿Por dónde comenzar?

para palurdos como yo comenzaría por una breve explicación de qué es eso de ejecutar tareas en paralelo y cuáles son las diferencias con el uso de threads.

Lo de las funciones anónimas y los métodos de clase lo dejaría sólo como referencia a otros artículos tuyos o de terceros.

LineComment Saludos

jhonny 24-04-2017 20:58:13

Cita:

Empezado por roman (Mensaje 515888)
Muchas gracias jhonny. Sí que queda claro, aunque



para palurdos como yo comenzaría por una breve explicación de qué es eso de ejecutar tareas en paralelo y cuáles son las diferencias con el uso de threads.

Lo de las funciones anónimas y los métodos de clase lo dejaría sólo como referencia a otros artículos tuyos o de terceros.

LineComment Saludos

Bueno Roman, si tú eres un palurdo, no sé qué soy yo entonces jejeje

Me alegra que se haya entendido y gracias por la retroalimentación, es un norte que necesitaba.

jhonny 24-04-2017 21:01:19

Cita:

Empezado por ecfisa (Mensaje 515887)
Hola roman.

Olvidé incluirlos en las pruebas :o, tal vez por que recordaba que aunque mejoraba el tiempo, no lo hacía un rival de la concatenación.
Código:

Concatenando  :    203 µs.
Mensaje      :    261 µs.
Begin/Update  :  858024 µs.
Método Add    : 3320579 µs.

Saludos :)

Bueno, a mí el BeginUpdate/EndUpdate me ha arrojado los mismo números que me arroja el uso de TParallel. Que curioso todo. :eek:

Casimiro Notevi 24-04-2017 21:22:48

Cita:

Empezado por jhonny (Mensaje 515893)
Bueno, a mí el BeginUpdate/EndUpdate me ha arrojado los mismo números que me arroja el uso de TParallel. Que curioso todo. :eek:

¿Tenéis un ordenador compartido? :eek:

jhonny 24-04-2017 21:44:36

Cita:

Empezado por Casimiro Notevi (Mensaje 515894)
¿Tenéis un ordenador compartido? :eek:

jejeje bueno, me refiero a que las pruebas que hice con el BeginUpdate/EndUpdate, me arrojaron el mismo resultado que me habían arrojado las pruebas que había hecho con TParallel en el ejercicio anterior... o sea, 295 milisegundo en promedio para 10000 como valor máximo.

Lo que me asombra es que a ecfisa se le haya demorado tanto usando BeginUpdate/EndUpdate.

roman 24-04-2017 21:55:18

Cita:

Empezado por jhonny (Mensaje 515899)
Lo que me asombra es que a ecfisa se le haya demorado tanto usando BeginUpdate/EndUpdate.

A mi me asombran sus números. No sé cómo los obtuvo. Para 1000 números yo obtengo:

Código:

Concatenando: Alrededor de 3,000 microsegundos
BeginUpdate/EndUpdate: Alrededor de 72,000 microsegundos

Uso esto:

Código Delphi [-]
type
  ICounter = Interface
    function Ellapsed(): Single;
    function EllapsedAsString: String;
  end;

  TCounter = class(TInterfacedObject, ICounter)
  private
    Frequency, StartTicks: Int64;

  public
    constructor Create();
    function Ellapsed(): Single;
    function EllapsedAsString: String;
  end;

{ TCounter }

constructor TCounter.Create;
begin
  QueryPerformanceFrequency(Frequency);
  QueryPerformanceCounter(StartTicks);
end;

function TCounter.Ellapsed: Single;
var
  CurrentTicks: Int64;

begin
  QueryPerformanceCounter(CurrentTicks);
  Result := 1000000*(CurrentTicks - StartTicks);
  Result := Result/Frequency;
end;

function TCounter.EllapsedAsString: String;
begin
  Result := FormatFloat('0,000.0 µs', Ellapsed);
end;

Ejemplo:

Código Delphi [-]
var
  Counter: ICounter;

begin
  Counter := TCounter.Create();

  // Proceso a medir

  ShowMessage(Counter.EllapsedAsString);
end;

LineComment Saludos

jhonny 24-04-2017 22:10:57

Cita:

Empezado por roman (Mensaje 515901)
A mi me asombran sus números. No sé cómo los obtuvo. Para 1000 números yo obtengo:

Uso esto:

.
.
.

Yo uso este record: http://docwiki.embarcadero.com/Libra...ics.TStopwatch

Así:

Código Delphi [-]
var
  sw: TStopWatch;
begin
    sw := TStopWatch.Create;
    sw.Start;
      //Proceso a medir
    sw.Stop;
    
    Label1.Caption := sw.ElapsedMilliseconds.ToString; //Lugar donde muestro el resultado de la medición...
end;

roman 24-04-2017 22:17:01

Tus resultados son en milisegundos y los míos en microsegundos. En realidad, lo hice en microsegundos porque ecfisa así lo hizo, o al menos es lo que indica la unidad µs que puso. Quizá sean milisegunods pero aún así, es demasiado tiempo para el beginupdate/endupdate. Aunque, ciertamente, es más lento este último método.

LineComment Saludos

jhonny 24-04-2017 22:26:21

Cita:

Empezado por roman (Mensaje 515904)
Tus resultados son en milisegundos y los míos en microsegundos. En realidad, lo hice en microsegundos porque ecfisa así lo hizo, o al menos es lo que indica la unidad µs que puso. Quizá sean milisegunods pero aún así, es demasiado tiempo para el beginupdate/endupdate. Aunque, ciertamente, es más lento este último método.

LineComment Saludos

Ciertamente, así es. El error mío no ha sido el tema de la conversión entre milisegundos y microsegundos, pues soy consciente que los resultados de ecfisa y los tuyos son en microsegundos... el error mío ha sido que he comparado los ejercicios incorrectos... debo comparar es el de String vs Begin/Update. Que ciertamente concatenar el String ha resultado mucho más rápido.

De todas maneras (Por si sirve de algo), para hacer el calculo con dicho record con todo el valor, se puede hacer así:

Código Delphi [-]
var
  sw: TStopWatch;
begin
    sw := TStopWatch.Create;
    sw.Start;
      //Proceso a medir
    sw.Stop;
    
    Label1.Caption := sw.Elapsed.ToString; //Que para el BeginUpdate/EndUpdate me devuelve 00:00:00.2985187 y concatenando 00:00:00.0021155
end;

ecfisa 25-04-2017 03:55:58

Hola.

Pido disculpas, por que el tiempo transcurrido para la concatenación era de 2038 µs y no como erróneamente escribí 203 µs. :o
Luego al agregar el resultado de la prueba con BeginUpdate/EndUpdate, copié/pegué del mensaje #12 y reproduje el error en el mensaje #20.

Es decir que el único método que me arrojó valores por debajo de los 400 µs. fué el que se vale del uso de mensajes. Pero hay que aclarar que no es el tiempo total en completar la ejecución, ya que hay que sumarle lo que toma el S.O. para procesar la cola de mensajes para finalizar el mostrado ( se recibe el resultado cuando aún no terminó la impresión ).

Saludos :)


La franja horaria es GMT +2. Ahora son las 22:53:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi