Высокая задержка Java BlockingQueue в Linux

Можно искать эти type() функция.

Видят примеры ниже, но нет никакого "неподписанного" типа в Python точно так же, как Java.

Положительное целое число:

>>> v = 10
>>> type(v)
<type 'int'>

Большой положительное целое число:

>>> v = 100000000000000
>>> type(v)
<type 'long'>

Отрицательное целое число:

>>> v = -10
>>> type(v)
<type 'int'>

Литеральная последовательность символов:

>>> v = 'hi'
>>> type(v)
<type 'str'>

целое число С плавающей точкой:

>>> v = 3.14159
>>> type(v)
<type 'float'>
25
задан Johan 10 January 2011 в 09:05
поделиться

1 ответ

@Peter Lawrey

Некоторые операции используют вызовы ОС (такие как блокировка / циклические барьеры)

Это НЕ ОС (ядро) звонки. Реализовано с помощью простого CAS (который на x86 поставляется без свободной памяти)

Еще один: не используйте ArrayBlockingQueue, если вы не знаете, почему (вы используете его).

@OP: Посмотрите на ThreadPoolExecutor, он предлагает отличную среду для производителей и потребителей.

Изменить ниже :

, чтобы уменьшить задержку (исключая ожидание занятости), измените очередь на SynchronousQueue и добавьте следующее, как перед запуском потребителя

...
consumerThread.setPriority(Thread.MAX_PRIORITY);
consumerThread.start();

Это лучшее, что вы можете получить.


Edit2: здесь с синхронизацией. очередь. И не печатать результаты.

package t1;

import java.math.BigDecimal;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.SynchronousQueue;

public class QueueTest {

    static final int RUNS = 250000;

    final SynchronousQueue<Long> queue = new SynchronousQueue<Long>();

    int sleep = 1000;

    long[] results  = new long[0];
    public void start(final int runs) throws Exception {
        results = new long[runs];
        final CountDownLatch barrier = new CountDownLatch(1);
        Thread consumerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                barrier.countDown();
                try {

                    for(int i = 0; i < runs; i++) {                        
                        results[i] = consume(); 

                    }
                } catch (Exception e) {
                    return;
                } 
            }
        });
        consumerThread.setPriority(Thread.MAX_PRIORITY);
        consumerThread.start();


        barrier.await();
        final long sleep = this.sleep;
        for(int i = 0; i < runs; i++) {
            try {                
                doProduce(sleep);

            } catch (Exception e) {
                return;
            }
        }
    }

    private void doProduce(final long sleep) throws InterruptedException {
        produce();
    }

    public void produce() throws InterruptedException {
        queue.put(new Long(System.nanoTime()));//new Long() is faster than value of
    }

    public long consume() throws InterruptedException {
        long t = queue.take();
        long now = System.nanoTime();
        return now-t;
    }

    public static void main(String[] args) throws Throwable {           
        QueueTest test = new QueueTest();
        System.out.println("Starting + warming up...");
        // Run first once, ignoring results
        test.sleep = 0;
        test.start(15000);//10k is the normal warm-up for -server hotspot
        // Run again, printing the results
        System.gc();
        System.out.println("Starting again...");
        test.sleep = 1000;//ignored now
        Thread.yield();
        test.start(RUNS);
        long sum = 0;
        for (long elapsed: test.results){
            sum+=elapsed;
        }
        BigDecimal elapsed = BigDecimal.valueOf(sum, 3).divide(BigDecimal.valueOf(test.results.length), BigDecimal.ROUND_HALF_UP);        
        System.out.printf("Avg: %1.3f micros%n", elapsed); 
    }
}
1
ответ дан 28 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: