Entonces la mejor forma de recorrer un array que además su contenido son objetos de una clase ¿ sería esta ?: for each x in aArray
WITH OBJECT x
:cMatricula
:cMarca
:cModelo
:nPrecio
END
next x
function main()
public aArray := {=>} , x
aArray [ "M-1234-DF" ] := Tcoche():New( "M-1234-DF" )
aArray [ "V-4321-AF" ] := Tcoche():New( "V-4321-AF" )
aArray [ "B-1111-AA" ] := Tcoche():New( "B-1111-AA" )
aArray [ "O-2222-BB" ] := Tcoche():New( "O-2222-BB" )
aArray [ "L-3333-CC" ] := Tcoche():New( "L-3333-CC" )
for each x in aArray
WITH OBJECT x
:cMatricula
:cMarca
:cModelo
:nPrecio
END
next x
return nil
**************************************************************************
CLASS Tcoche
DATA cMatricula,cMarca,nPrecio
CLASSDATA lRegistered AS LOGICAL
METHOD New ( cIndicativo ) CONSTRUCTOR
METHOD End()
ENDCLASS
METHOD New ( cMatricula ) CLASS Tcoche
DEFAULT cMatricula:="X-9999-XX"
::cMatricula:=cMatricula
::cMarca:="SCENIC
::cModelo:="Renault"
::nPrecio:=10000
return Self
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
SI se desea ganar velocidad no es recomendable usar ADS local. El uso de esta herramienta disminuye la velocidad de acceso a los archivos a veces hasta en un 40%.
Ads local tiene algunas ventajas como la encriptacion de archivos, manejo de diccionario de datos, uso de instrucciones SQL, etc. pero al costo de disminuir la velocidad de acceso.
Con ADS Servidor no disminuye la velocidad puesto que es cliente servidor.
Correcto, es más, mi recomendación es meter ADS y los RDD que necesitemos, y con un simple, usar uno u otro.
Así, si nos encontramos que debemos usar ADS , no tenemos que recompilar o tener 2 exes distintos.
Usar la version 7.0 de ADS, nos servirá para los servidores 7 y superiores.
//SOPORTE PARA ADS
FUNCTION ADS( nTipo )
#include "ads.ch"
REQUEST AdsKeyNo,ADSKeycount,ADSGetRelKeyPos,ADSSetRelKeyPos
REQUEST ADS, ADSNTX
rddRegister("ADS",1)
rddsetdefault( "ADSNTX" )
AdsSetServerType( nTipo ) // Atención, tenemos que determinar el tipo de conexion, 7 a todos.
RETURN NIL
function arranca()
//..... codigo .....
if empty( cServer ) // No hay servidor de ads
rddsetdefault( 'DBFNTX' ) // Forzamos RDD por defecto de HARBOUR
else
if AdsIsServerLoaded( cServer ) > 0 // Encontramos servidor de ADS
ADS( nTipo )
else
Alert( "No se encuentra servidor ADS en :" +cServer )
quit
endif
endif
// .... etc.....
Mi recomendacion es intentar optimizar procesos. Harbour tendra su limitación dentro de la ejecucion de pcode, pero afinar y obtener buenos ratios estriba mas en la logica del proceso. En cuanto al uso de RDD yo no escatimaria RDD de ADS Local o Server es igual, las ventajas q reporta son idiscutibles aun cuanto pierdes un "poco" de rendimiento, relativo segun como lo mires. Por ejemplo leer 1 millon de registros con DBFCDX estas 1 seg. y con ADSCDX el doble, y ? pero esto es un millon de registros.
Salutacions, saludos, regards
"...programar es fácil, hacer programas es difícil..."
Carles, correcto, por eso el usar el profile es super útil. Ahi puedes sacar muchas conclusiones y ver donde estás perdiendo el tiempo y ver como puedes llegar a optimizar
las funciones que están perdiendo mucho el tiempo.
Por ejemplo, una cosa tonta es
cValor := Funcion_Mia() // Devuelve siempre el mismo valor
while !eof()
... etc...
... etc...
if !empty( cValor )
...etc....
endif
end while
Estas pequeñas cosas pueden ser vistas por pistas del profile. Por ejemplo, aqui se llamará UNA SOLA LLAMADA, dentro del while, si tenemos 10.0000 regitros, tendremos , 10.0000 llamadas a la función
Funcion_Mia().
Yo use por mucho tiempo en mis aplicaciones ADS local, que es gratuito, y en red con solo 10000 registros la velocidad dismiye casi un 40% comparado con el rdd nativo de xharbour teniendo solo tres terminales, y aun usando instrucciones sql. Si usas ads local en un solo equipo la diferencia de velocidad no es notable, ¡pero en red uff¡. Sobre todo notas la lentitud si manejas muchos browse. ADS Server, el que tiene costo, se supone que debe de ser mas rapido porque es cliente servidor aunque yo no lo he probado pero pero con la ventaja del uso del sql el rendimiento debe de ser buenisimo. Con el ADS loxal la velocidad disminuye bastante con cada terminal en la que corre el sistema (aunque el ads local solo permite que se conecten 5 computadoras corriendo la misma aplicacion). No se su opinion pero en mi experiencia el rendimiento de una aplicacion esta mas determinado por la velocidad de acceso a los archivos que por otra cosa. Claro suponiendo que se tiene el hardware adecuado y que no sea el culpable de la lentitud de los programas.
MarioG wrote:jm;
Si el array es de muchos registros, como tu sample, te sugiero usar FOR EACH (la explicación en Optimizacion IV).
Saludos
Disculpa Mario, pero cuando hablas de "La explicación en Optimización IV", ¿ a que se refiere eso ? ¿ es un apartado de Fwh ? o ¿ donde puedo leer acerca de ello ?
No voy a ser yo quien defenda las multiples cualidades q ofrece Ads. La diferencia que puedes notar en red usando el modo ads local esta en el concepto del producto. En entornos con arquitectura distribuida tienes q valorar mucho las consecuencias que puedes tener tu software a nivel de rendimiento, pero tambien de escabilidad, integridad, seguridad y mantenimiento.
Tanto el rdd de xH como el de ADS funcionan correctamente y uno es mas rapido q otro ? Si, es cierto (siempre hablando en modo local), pero es q ads tampoco esta pensado para trabajar con numerosos usuarios con su modo local ALS, sino que te ofrece la posibilidad de tener un sistema que si en un momento dado necesitas ofrecer esta funcionalidad a mas usuarios, facilmente la ofreces por un minimo coste, y luego hablaremos de los costes.
Si tu creas un producto para una empresa con 2/5 usuarios y les haces pagar una licencia adicional por un ADS de 800€, quizas sera la razon para que declinen la compra de tu producto. Pero esta es la estrategia de ADS, te ofrece el modo Local y la posibilidad de pasar a un entorno Cliente/servidor de una manera transparente, rapida y eficaz, para mi la mejor.
Si quieres poner a trabajar en una aplicacion a muchos usuarios, con tablas grandes,... preparate para llevarte grandes problemas de lentitud e integridad de datos. Si hablamos de aplicaciones con tablitas y poco mas, quizas aguante bien, pero no es la solucion correcta, pero si la mas barata claro.
ALS es mas lento en este escenario de 2/5 usuarios, mas usuarios ya he comentado que no tiene sentido, pero por ejemplo tiene la ventaja de tener los datos encriptados y nadie puede tener acceso a ellos. Por otra parte usar sql en el ALS tampoco tiene sentido, porque en un sistema distribuido todos los datos se procesaran en el lado cliente, lo que quiere decir que se va a pasaar toda la tabla. _ no se notan en tablas pequeñas pero si en grandes.
Tu puedes programarte con tus transacciones, si lo usas en modo local no pasa nada y si en lugar de ALS pasa ACS el sistema ya lo ejecuta a la perfeccion. Las diferentes virtudes de ADS, Control de transacciones, datos encriptados (nadie puede echar mano ni con un excel), encriptacion en la comunicacion, sql, triggers, sistema transaccional, fiabilidad, estabilidad y robustez (adios a los ind. corruptos) es lo que a mi me decanta por este producto, que quizas tiene la mala fama de su costo, pero creo que al final es un tema de conocer perfectamente la realidad de todo el coste en un escenario de este tipo.
Si tu miras el precio en su total quizas asuste, pero si empiezas a comparar con lo que te supone un administrador de BD, instalaciones, formaciones, incluso alguna vez hardware, veras como no lo es tanto y encima ofreciendo las numerosas ventajas q tiene. Yo he tenido servidores ads que no se ha bajado ni una vez en mas de 2 años y el sistema perfecto com el primer dia !!
Creo q el uso de ADS es mas un tema estratégico que no otro. Si hay gente que prefiere valorar este 40% mas de velocidad de acceso, pues si es cierto, pero tambien decir, (lo he hecho en el post anterior) que el gran problema siempre esta en la logica del proceso (mi humilde opinion).
El uso de browser, he escrito muchas veces que, ni que tu puedas trabajar directamente en red, creo que no es la mejor manera para procesar y trabajar con los datos, pero si la mas comoda.
Salutacions, saludos, regards
"...programar es fácil, hacer programas es difícil..."
Yo me referia a: si se quiere aumentar la velocidad... (El tema del post es conseguir velocidad maxima)..., evitar el uso de ads LOCAL. Pero estoy de acuerdo con Carles hay que sopesar las ventajas de ALS (ads LOCAL) como el encriptamiento de archivos, etc. que me parecen excelentes, de echo yo use mucho tiempo ads local y tengo aplicaciones en las que las ventajas de ALS son mayores que el aumento de la velocidad y lo siguo usando con estas. Pero tengo algunas otras aplicaciones en donde para mi fue mas importante la velocidad de acceso, lo cual no seria un problema si mis clientes optaran por adquirir el ADS (SERVIDOR) pero eso es un poco dificil.