Algoritmo FIFO
Algoritmo FIFO
Algoritmo FIFO
Es una simple cola. Como la de los boletos en el cine, como la de las tortillerias, donde los que van
llegando se forman hasta el final de la cola, asi que el primero que habia llegado a la cola, es el
primero que va a salir porque esta hasta el frente.
Una estrategia sencilla e intuitivamente razonable es seleccionar para la sustitución la página que lleva más tiempo en memoria. La
implementación de este algoritmo es simple.
Además, no necesita ningún apoyo hardware especial. El sistema operativo debe mantener una lista de las páginas que están en memoria,
ordenada por el tiempo que llevan residentes. En el caso de una estrategia local, se utiliza una lista por cada proceso.
Cada vez que se trae una nueva página a memoria, se pone a1 final de la lista. Cuando se necesita reemplazar, se usa la página que está al
principio de la lista.
Sin embargo, el rendimiento del algoritmo no es siempre bueno. La página que lleva más tiempo residente en memoria puede contener
instrucciones o datos que se acceden con frecuencia. Además, en determinadas ocasiones, este algoritmo presenta un comportamiento
sorprendente conocido como la anomalía de Belady [Belady, 1969].
Intuitivamente parece que cuantos más marcos de página haya en el sistema, menos fallos de página se producirán. Sin embargo, ciertos
patrones de referencias causan que este algoritmo tenga un comportamiento opuesto. El descubrimiento de esta anomalía resultó al principio
sorprendente y llevó al desarrollo de modelos teóricos para analizar los sistemas de paginación. En la práctica, esta anomalía es más bien una
curiosidad que demuestra que los sistemas pueden tener a veces comportamientos inesperados.
Las mejores páginas para cambiar son las que se encuentran en la categoría 0, mientras que
las peores son las de la categoría 3. Se desaloja al azar una página de la categoría más baja
que no esté vacía. Este algoritmo se basa en la suposición de que es mejor desalojar una
página modificada a la que no se ha hecho referencia en al menos un tic de reloj, en vez de
una página limpia que se está usando mucho.
Ejemplos (Aging)
Este algoritmo es un descendiente del algoritmo "No usada frecuentemente", con algunas
modificaciones necesarias para tener en cuenta en qué momento fue usada frecuentemente
una página, y no solamente cuántas veces fue referenciada.
De esta forma, cuando se necesite eliminar una página de memoria, se eliminará la que
tenga el número más pequeño en su contador.
Este algoritmo provee una buena aproximación al desempeño del algoritmo óptimo, por un
módico precio.
Algoritmo FIFO.- First In First Out - Los procesos se ejecutan según su orden de llegada. El primero en entrar
no libera los recursos hasta que termina. Es el más sencillo pero el más ineficaz.
I'm not quite sure who gave the best contributions regarding possible improvements for last
newsletter's SocketWheel. Josh Rehman pointed out that it is not too clever to try minimze
memory as that is very cheap nowadays, which I agree with. He also pointed out that JDK
1.4 has non-blocking IO making it possibly a lot easier to implement such a SocketWheel.
Ecce Jezuch (Poland) suggested using the available() method to find out how many bytes
would be available without blocking, but unfortunately under Windows the JDK always
returned 0. También señaló que el JDK 1.4 tiene sin bloqueo de E / S por lo que es
posiblemente mucho más fácil aplicar dicho SocketWheel. Ecce Jezuch (Polonia) sugirió el
uso de la disposición () para averiguar cuántos bytes estarían disponibles sin el bloqueo,
pero lamentablemente en Windows el JDK siempre se devuelve 0.
James Pereira provided some excellent information regarding sockets. James Pereira
proporcionan excelente información sobre zócalos. It's quite technical, so I'm including it
verbatim: Es muy técnico, así que estoy inclusión literal:
"Registered Ports, ports between 1024 and 49151, are listed by the IANA and on most
systems can be used by applications or programs executed by users. Table C.2 specifies the
port used by the server process as its contact port. The IANA registers uses of these ports as
a convenience to the Internet community. To the extent possible, these same port
assignments are used with UDP. The Registered Ports are in the numerical range of 1024-
49151. The Registered Ports between 1024 and 5000 are also referred to as the Ephemeral
Ports. At least on Windows , The TCP/Stack (OS) re-uses these ports internally on every
socket connection cycling from 1024...5000 wrapping around to 1024 again. This could
lead to some interesting problems if sockets are opened and close very quickly as there is
usually a time delay before that port is made available again... "Puertos registrados, los
puertos entre 1024 y 49151, son enumerados por la IANA y en la mayoría de los sistemas
pueden ser utilizados por las aplicaciones o programas ejecutados por los usuarios. Tabla
C.2 especifica el puerto usado por el proceso de servidor como su puerto de contacto.
IANA registra los los usos de estos puertos como una conveniencia para la comunidad de
Internet. En la medida de lo posible, estas mismas asignaciones de puerto se utilizan con
UDP. Los puertos registrados están en el rango numérico de 1024-49151. Los puertos
registrados entre 1024 y 5000 también se conocen como los puertos efímeros. Por lo menos
en Windows, TCP / Pila (OS) re-utiliza estos puertos internos en cada ciclo de conexión de
socket de 1024 ... 5000 envolviendo a 1024 de nuevo. Esto podría llevar a algunos
problemas interesantes si tomas son abrir y cerrar muy rápidamente, ya que suele ser un
tiempo de retraso antes de que el puerto esté disponible de nuevo ...
"Second, the number of user-accessible ephemeral ports that can be used to source
outbound connections is configurable with the MaxUserPort registry entry
(HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters). By default, when an
application requests any socket from the system to use for an outbound call, a port between
the values of 1024 and 5000 is supplied. You can use the MaxUserPort registry entry to set
the value of the highest port number to be used for outbound connections. For example,
setting this value to 10000 would make approximately 9000 user ports available for
outbound connections. For more details, see RFC 793. See also the MaxFreeTcbs and
MaxHashTableSize registry settings
(HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters). "En segundo lugar, el
número de puertos efímeros de acceso de usuario que se puede utilizar para conexiones
salientes fuente se puede configurar con la entrada del Registro MaxUserPort (HKLM \
SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters). De forma predeterminada,
cuando una aplicación solicita cualquier toma de el sistema a utilizar para una llamada
saliente, un puerto entre los valores de 1024 y 5000 se suministra. Puede utilizar la entrada
del Registro MaxUserPort para establecer el valor del número de puerto más alto que se
utilizará para las conexiones de salida. Por ejemplo, el establecimiento de este valor 10000
tendría aproximadamente 9000 puertos de usuario disponible para conexiones salientes.
Para más detalles, consulte el documento RFC 793. Véase también el MaxFreeTcbs y
registro de configuración de MaxHashTableSize (HKLM \ SYSTEM \ CurrentControlSet \
Services \ Tcpip \ Parameters).
"BTW: The stack and memory size issue is only an NT issue. On NT the stack size is
configurabale via linker and EditBin.exe unfortunately we don't want to mess with the
VM." "Por cierto: La pila y el tamaño del problema de memoria es sólo una cuestión NT
VM. En NT el tamaño de pila es configurabale a través de enlazador y EditBin.exe
lamentablemente no queremos que meterse con el."
This information should solve the problem that I encountered with too many sockets
causing exceptions. Esta información debería resolver el problema que me encontré con
muchas tomas demasiado causando excepciones.
Ideally we should be able to specify stack size per thread as some threads will need a lot
and others only a little, so I still think that we have a problem with many threads and their
stack size. Idealmente deberíamos ser capaces de especificar el tamaño de pila por hilo ya
que algunos temas se necesita mucho y otros sólo un poco, por lo que sigo pensando que
tenemos un problema con muchos hilos y su tamaño de la pila.
Another excellent contribution was made by Craig Larman, author of "Java 2 Performance
and Idiom Guide", who suggested using an approach of multiplexing sockets described in
his book to minimize the number of sockets needed per client connection. Next week I will
try and write about this idea and give you a solution that hopefully will work acceptably.
Otra excelente contribución fue hecha por Craig Larman, autor de "Java 2 Rendimiento y
Idiom Guía", quien sugirió el uso de un enfoque de cuencas multiplexación se describe en
su libro de reducir al mínimo el número de tomas de corriente necesaria por conexión de
cliente. La próxima semana voy a tratar de escribir sobre esta idea y darle una solución que
esperamos que sean aceptablemente. I always recommend Craig's book as an excellent
book for the Java fundi who wants to have his mind activated regarding performance ideas.
Yo siempre recomiendo el libro de Craig como un excelente libro para el fondo de ojo Java
que quiere tener su mente activa con respecto a las ideas de rendimiento. It is very difficult
to write anything about performance as it is so dependent on your implementation and
hardware. Es muy difícil escribir algo sobre el rendimiento, ya que es tan dependiente en su
aplicación y el hardware. This leads me to this week's newsletters on self-tuning FIFO
queues.... Esto me lleva a la semana los boletines de este ajuste en las colas FIFO-yo ....
HotSpot(tm) has caused a lot of trouble for the Java Specialist in the field, especially those
of us with a few years experience. All of a sudden, all the hard-earned performance
knowledge was wiped out in one foul swoop. HotSpot (TM) ha causado muchos problemas
para el especialista en Java en el campo, especialmente aquellos de nosotros con una
experiencia de unos pocos años. De repente, todos los resultados obtenidos en el
conocimiento duro fue aniquilada en una sola vez falta. The only thing left for us to do was
to write the simplest code that could possibly work and let the HotStop compiler sort out
performance for us. Lo único que nos queda por hacer es escribir el código más simple que
podría funcionar y dejar que el tipo de rendimiento del compilador HotStop para nosotros. I
liken it to the great financial crisis of Japan in the 90's, where no one knew whether he was
coming or going and all the old certainties went out of the window. Lo comparo con la gran
crisis financiera de Japón en los años 90, cuando nadie sabía si estaba yendo o viniendo y
todas las viejas certezas se fue por la ventana. Luckily, unlike in Japan, we are not taking
this too seriously, so our windows are still closed. Fortunately everyone knows that Java is
slow ;-) Afortunadamente, a diferencia de Japón, no estamos tomando muy en serio, por lo
que nuestras ventanas están cerradas todavía. Afortunadamente todo el mundo sabe que
Java es lento ;-)
A lot of the performance tricks we used in old code actually make our code slower under
HotSpot. Muchos de los trucos de rendimiento que utilizamos en el código antiguo
realmente hacer nuestro código más lento en HotSpot. Since we don't know what the
performance of our code will be for a specific platform, would it be completely hairbrained
to write self-tuning code? Dado que no sabemos lo que el rendimiento de nuestro código
será para una plataforma específica, sería completamente hairbrained para escribir código
de auto-ajuste? Write 3 algorithms, let the program measure on the target platform which
performs best, and choose that algorithm for the duration of the VM. Escribe tres
algoritmos, que mide el programa en la plataforma de destino que se comporta mejor, y
elegir el algoritmo para la duración de la máquina virtual.
To illustrate this idea, I want to write a FIFO queue that is based on a java.util.List
implementation. Para ilustrar esta idea, quiero escribir una cola FIFO que se basa en una
aplicación java.util.List. A while ago I discovered that java.util.ArrayList is sometimes
faster than java.util.LinkedList for FIFO queue implementations. Hace un tiempo descubrí
que java.util.ArrayList veces es más rápido que java.util.LinkedList para las
implementaciones de cola FIFO. The switch over occurs at a specific point in time, which
we can measure beforehand. El interruptor se verifica en un punto específico en el tiempo,
que podemos medir de antemano. The switch-over point is dependent on the VM, whether
we are using HotSpot(tm), etc. For example, on my little notebook with 256MB RAM and
Pentium III 700, the cross-over point is 50 elements in the list when I use HotSpot, but 500
elements when I switch off hotspot compiling (sometimes!). La transición a punto depende
de la máquina virtual, si estamos utilizando HotSpot (TM), etc Por ejemplo, en mi pequeña
libreta con 256 MB de RAM y Pentium III 700, el punto de cruce es de 50 elementos de la
lista cuando uso de HotSpot, pero los elementos 500 al cambiar de punto de acceso
compilación (a veces!).
The interface that the FIFO queues will implement is very simple: La interfaz que las colas
FIFO implementará es muy simple:
We implement this interface and extend ArrayList and LinkedList: Implementamos esta
interfaz y ampliar ArrayList y LinkedList:
// FIFOArrayList.java / / FIFOArrayList.java
import java.util.ArrayList; importación java.util.ArrayList;
public class FIFOArrayList extends ArrayList implements FIFO
{ FIFOArrayList clase pública se extiende ArrayList implementa FIFO {
public Object remove() { Objeto público remove () {
return remove( 0 ); volver eliminar (0);
} }
} }
// FIFOLinkedList.java / / FIFOLinkedList.java
import java.util.LinkedList; importación java.util.LinkedList;
public class FIFOLinkedList extends LinkedList implements FIFO
{ FIFOLinkedList clase pública se extiende LinkedList implementa FIFO {
public Object remove() { Objeto público remove () {
return remove( 0 ); volver eliminar (0);
} }
} }
We also write a SwappingOverFIFOQueue which has values for HIGH and LOW water
marks. También escribe una SwappingOverFIFOQueue que tiene valores para alto y bajo
marcas de agua. When we reach a HIGH water mark and we are busy using an ArrayList,
we start using a LinkedList. Cuando llegamos a una marca de marea alta y estamos muy
ocupados con un ArrayList, que empiece a usar una LinkedList. On the contrary, if we
reach a LOW water mark and we are busy using a LinkedList we start using an ArrayList.
Por el contrario, si llegamos a una marca de agua baja y estamos ocupados con una
LinkedList que empezar a usar un ArrayList.
In foresight to my next example, I have made it possible to set the watermarks, which also
checks the optimal list types for all the lists currently in the system. En previsión de mi
ejemplo siguiente, me han hecho posible el establecimiento de las marcas de agua, que
también verifica los tipos de lista óptima para todas las listas actualmente en el sistema. We
have to be careful to not get a memory leak by keeping handles to the instances of the
SwappingOverFIFOQueue so we use WeakReferences to hold the references. Tenemos que
tener cuidado de no obtener una pérdida de memoria, manteniendo las manijas de las
instancias de la SwappingOverFIFOQueue así que usamos WeakReferences para mantener
las referencias. Have a look at newsletter 15 for a discussion on Weak / Soft References.
Echa un vistazo a boletín 15 para una discusión sobre la débil / Referencias suave.
My test program takes the number of entries in the queue and then illustrates how often we
can add/remove in 2 seconds for each of the queues. Mi programa de prueba toma el
número de entradas en la cola y, a continuación ilustra la frecuencia con la que podemos
añadir o eliminar en 2 segundos para cada una de las colas. I found that you get the best
performance results when you run your tests for about 2 seconds each, so I count iterations
rather than milliseconds. He encontrado que usted obtiene el mejor resultado de
rendimiento al ejecutar las pruebas durante unos 2 segundos cada uno, así que en lugar de
contar las iteraciones milisegundos.
On my notebook, when I run this program with 0 entries, I get the following output: En mi
cuaderno, cuando ejecuto este programa con 0 registros, me sale el siguiente resultado:
Entries = 0 Entradas = 0
class FIFOArrayList FIFOArrayList clase
4552883 iterations 4552883 iteraciones
class FIFOLinkedList FIFOLinkedList clase
2551017 iterations 2551017 iteraciones
class SwappingOverFIFOQueue clase SwappingOverFIFOQueue
3594810 iterations 3594810 iteraciones
We can thus see that the SwappingFIFOQueue is always faster than the worst case and
slower than the best case, as one would logically expect. Por eso podemos comprender que
la SwappingFIFOQueue es siempre más rápido que el peor de los casos y más lento que el
mejor de los casos, como era de esperar. However, I chose the HIGH and LOW values
from some tests that I made on my notebook, for that specific JVM. Sin embargo, he
elegido el ALTA y BAJA valores de algunas pruebas que hice en mi portátil, para que la
JVM específica. If I take the JDK 1.2.2 that comes with JBuilder, for 100 entries I get: Si
tomo el JDK 1.2.2 que viene con JBuilder, para 100 entradas me sale:
Or if I use the -Xint mode for JDK 1.3 under Windows to switch off the hotspot compiler,
for 100 entries I get O si uso en modo Xint la de JDK 1.3 en Windows para apagar el
compilador de punto de acceso, para 100 de las entradas me
We therefore write a Profiler that finds ideal HIGH/LOW water marks for the JVM that is
running on your system and sets up the SwappingOver water marks. Por lo tanto, escribir
un analizador que encuentra ideal ALTO BAJO marcas de agua / de la máquina virtual Java
que se ejecuta en su sistema y establece las marcas de agua SwappingOver.
If we load this class in our system then it will do measurements of where the swap-over
between ArrayList and LinkedList performance occurs. Si la carga esta clase en nuestro
sistema, entonces va a hacer las mediciones del lugar donde el canje de más de entre
ArrayList y LinkedList rendimiento se produce. On my computer, with JDK 1.3 and
HotSpot, the swap-over was measured to happen at about 32 entries in the list. En mi PC,
con JDK 1.3 y HotSpot, el canje de más de se midió a ocurrir en alrededor de 32 entradas
en la lista. When I switch off the HotSpot, it occurs at about 121 entries, and under JDK
1.2.2 it happens at about 303. Cuando apago el punto caliente, que se produce en cerca de
121 entradas, y en el JDK 1.2.2 que ocurre en alrededor de 303.
After spending about 10 hours on this stupid newsletter, I have to conclude that it would be
better to stick to a LinkedList for a FIFO queue as it is a better "average" performer.
Después de pasar unas 10 horas en este boletín de noticias estúpidas, tengo que concluir
que sería mejor quedarse con una LinkedList para una cola FIFO, ya que es un mejor
"promedio" artista intérprete o ejecutante. Perhaps the lesson I've learnt from this
newsletter is that we must be careful of writing code which is too complicated as it tends to
be more difficult to optimize. Tal vez la lección que he aprendido de este boletín es que
debemos tener cuidado de escribir código que es muy complicado ya que tiende a ser más
difíciles de optimizar. As performance guru Craig Larman pointed out though, we must be
sure to not ignore performance altogether; our customers might just kill the project if the
prototypes perform like dogs. Como el rendimiento gurú de Craig Larman señaló, sin
embargo, debemos estar seguros de no pasar por alto el rendimiento total, los clientes que
sólo puede matar el proyecto si los prototipos se comportan como perros.
I always appreciate any feedback, both positive and negative, so please keep sending your
ideas and suggestions. Siempre agradecemos cualquier comentario, tanto positivas como
negativas, así que por favor sigan enviando sus comentarios y sugerencias. Please also
remember to take the time to send this newsletter to others who are interested in Java. Por
favor, también a acordarse de tomar el tiempo para enviar este boletín a otros que están
interesados en Java.
Heinz Heinz
http://translate.google.com.mx/translate?hl=es&langpair=en
%7Ces&u=http://www.roseindia.net/javatutorials/selftuning_fifo_queues.shtml
interfaz pública FIFO {
/ ** Agregar un objeto al final de la cola FIFO * /
booleano add (Object o);
/ ** Eliminar un objeto desde la parte frontal de la cola FIFO * /
Objeto de eliminar ();
/ ** Devuelve el número de elementos en la cola FIFO * /
int size ();
}
/ / FIFOArrayList.java
importación java.util.ArrayList;
public class FIFOArrayList se extiende ArrayList implementa FIFO {
pública Objeto de eliminar () {
volver eliminar (0);
}
}
/ / FIFOLinkedList.java
importación java.util.LinkedList;
public class FIFOLinkedList se extiende LinkedList implementa FIFO {
pública Objeto de eliminar () {
volver eliminar (0);
}
}
También escribe una SwappingOverFIFOQueue que tiene valores para alto y bajo marcas
de agua. Cuando llegamos a una marca de marea alta y estamos muy ocupados con un
ArrayList, que empiece a usar una LinkedList. Por el contrario, si llegamos a una marca de
agua baja y estamos ocupados con una LinkedList que empezar a usar un ArrayList.
/ / SwappingOverFIFOQueue.java
importación java.util .*;
importación java.lang.ref.WeakReference;
clase pública final SwappingOverFIFOQueue implementa FIFO {
/ ** El valor baja después de que cambiar a ArrayList * /
static int privado BAJO = 30;
/ ** El alto valor después de que el interruptor hacia abajo para
LinkedList * /
static int privado ALTO = 70;
/ ** Esta lista contiene referencias débiles de las instancias de este
clase * /
private static Lista de casos = nuevo LinkedList ();
/ ** Añadimos las escasas referencias en un bloque de inicialización */
{
instances.add (nuevo WeakReference (esta));
}
/ ** Cuando establecimos las marcas de agua de bajo y alto que pasar
por todo
las instancias existentes y verifique el tipo de lista óptima.
Si la referencia es nula quitamos la WeakReference de
nuestra instancia de la lista. * /
public static void setWaterMarks (int baja, int de alto) {
BAJO = bajo;
ALTO = alto;
Iterador que instances.iterator = ();
mientras que(It.hasNext ()) {
ref = WeakReference (WeakReference) it.next ();
SwappingOverFIFOQueue q = (SwappingOverFIFOQueue) ref.get ();
si (Q == nulo) {
it.remove ();
} más {
q.checkOptimalListType ();
}
}
}
/ / SwappingOverFIFOQueueTest.java
importación java.util .*;
public class SwappingOverFIFOQueueTest {
static int privado ENTRADAS;
public static void prueba (cola FIFO) {
de (int i =0; I ENTRADAS <; i + +) {
queue.add (nuevo Object ());
}
de largo up_to System.currentTimeMillis = () + 2000;
int iteraciones = 0;
mientras que(System.currentTimeMillis () <= up_to) {
queue.add (nuevo Object ());
queue.remove ();
iteraciones + +;
}
System.out.println (queue.getClass ());
System.out.println ("\ T" + + Iteraciones "Iteraciones");
}
public static void principal (String [] args) {
si (Args.length! = 1) {
System.out.println (
"Uso: java SwappingOverFIFOQueueTest las entradas");
System.exit (1);
}
ENTRADAS = Integer.parseInt (args [0]);
System.out.println ("Las entradas =" + Entradas);
prueba (nuevo FIFOArrayList ());
prueba (nuevo FIFOLinkedList ());
SwappingOverFIFOQueue q = nuevo SwappingOverFIFOQueue ();
prueba (q);
System.out.println ("Implementación de la cola actual" +
q.getListType () getName ()).;
}
}
Entradas = 0
FIFOArrayList clase
4552883 iteraciones
FIFOLinkedList clase
2551017 iteraciones
clase SwappingOverFIFOQueue
3594810 iteraciones
Entradas = 10000
FIFOArrayList clase
49.500 iteraciones
FIFOLinkedList clase
812.933 iteraciones
clase SwappingOverFIFOQueue
758.657 iteraciones
Por eso podemos comprender que la SwappingFIFOQueue es siempre más rápido que el
peor de los casos y más lento que el mejor de los casos, como era de esperar. Sin embargo,
he elegido el valores altos y bajos de algunas pruebas que hice en mi portátil, para que la
JVM específica. Si tomo el JDK 1.2.2 que viene con JBuilder, para 100 entradas me sale:
O si utilizo el modo Xint para JDK 1.3 en Windows para apagar el compilador de punto de
acceso, de 100 entradas me
En ambos casos, los valores de la SwappingOverFIFOQueue eran peores que tanto para el
ArrayList y LinkedList el.
Por lo tanto, escribir un analizador que encuentra ideal marcas ALTA / BAJA agua para la
máquina virtual Java que se ejecuta en su sistema y establece las marcas de agua
SwappingOver.
/ / SwappingOverFIFOQueueProfiler.java
importación java.util .*;
/ *
En aras de la brevedad, sólo se consideran dos implementaciones
de java.util.List, a saber, java.util.ArrayList y
java.util.LinkedList. * /
public class SwappingOverFIFOQueueProfiler {
booleana estática privado isArrayListFaster (int las entradas) {
System.out.println ("IsArrayListFaster (" + Entradas + ")");
volver countIterations (nuevo ArrayList (), de las entradas)>
countIterations (nuevo LinkedList (), de las entradas);
}
static int privado countIterations (lista de la lista, int las
entradas) {
de (int i =0; I entradas <; i + +) {
list.add (nuevo Object ());
}
de largo = fin System.currentTimeMillis () + 1000;
int iteraciones = 0;
mientras que(System.currentTimeMillis () <= fin) {
iteraciones + +;
list.add (nuevo Object ());
list.remove (0);
}
volver iteraciones;
}
estática {
int controles = 0;
int marca de agua = 1;
int bestWatermark = 0;
de (int i =0; I <16; I + +) {
si (IsArrayListFaster (marca de agua)) {
bestWatermark = Math.max (marca de agua, bestWatermark);
marca de agua *= 2.0;
} más {
marca de agua *= 0.75;
si (<= BestWatermark marca de agua)
marca de agua *= 1.25;
}
}
System.out.println ("Mejor marca de agua =" + BestWatermark);
int bajo = (int) (* BestWatermark 0.75);
int alto = (int) (* BestWatermark 1.25);
System.out.println ("Marco para BAJA" + Bajo +
"ALTA y para" + Alto);
SwappingOverFIFOQueue.setWaterMarks (bajo, alto);
}
public static void principal (String [] args) {
SwappingOverFIFOQueueTest.main (nuevo String [] { "0" });
SwappingOverFIFOQueueTest.main (nuevo String [] { "100" });
SwappingOverFIFOQueueTest.main (nuevo String [] { "10000" });
}
}
Si la carga esta clase en nuestro sistema, entonces va a hacer las mediciones del lugar
donde el canje de más de entre ArrayList y LinkedList rendimiento se produce. En mi PC,
con JDK 1.3 y HotSpot, el canje de más de se midió a ocurrir en alrededor de 32 entradas
en la lista. Cuando apago el punto caliente, que se produce en cerca de 121 entradas, y en el
JDK 1.2.2 que ocurre en alrededor de 303.
Después de pasar unas 10 horas en este boletín de noticias estúpidas, tengo que concluir
que sería mejor quedarse con una LinkedList para una cola FIFO, ya que es un mejor
"promedio" artista intérprete o ejecutante. Tal vez la lección que he aprendido de este
boletín es que debemos tener cuidado de escribir código que es muy complicado ya que
tiende a ser más difíciles de optimizar. Como el rendimiento gurú de Craig Larman señaló,
sin embargo, debemos estar seguros de no pasar por alto el rendimiento total, los clientes
que sólo puede matar el proyecto si los prototipos se comportan como perros.
Siempre agradecemos cualquier comentario, tanto positivas como negativas, así que por
favor sigan enviando sus comentarios y sugerencias. Por favor, también a acordarse de
tomar el tiempo para enviar este boletín a otros que están interesados en Java.
Heinz