2016-04-04 4 views
4

мне интересно, о производительности и CPU/Требования к оперативной памяти для 2 различных методов, начиная runnablesAndroid нить работоспособной производительность

У меня есть некоторый код, который собирает данные датчиков каждые 10мс и вставляет значения в базу данных на фоне потока (используя один исполнитель потока). Исполнитель услуг создается следующим образом:

executor = Executors.newSingleThreadExecutor();

Один из способов сделать это было бы что-то вроде ...

public void onSensorChanged(SensorEvent event) { 
    //get sensor values 

    //insert into database 
    executor.execute(new Runnable(){ 
     //database insert code here 
    }); 
} 

Я вижу этот метод много в учебники, а потому, что я делаю это каждые 10 мс, он чувствует себя ресурсоемким, когда я создаю новый объект каждый раз, когда обнаруживается изменение значения датчика. Этот новый объект просто переопределяется каждые 10 мс? Или он занимает все большее количество ОЗУ при создании новых объектов?

Я так переработан мой код, чтобы выглядеть следующим образом:

executor = Executors.newSingleThreadExecutor(); 
myRunnable = new MyRunnable(); 

class MyRunnable implements Runnable { 
    public void run() { 
     //database insert code here 
    } 
} 

public void onSensorChanged(SensorEvent event) { 
    //get sensor values 

    //insert into database 
    executor.execute(myRunnable); 
} 

Мое мышление является то, что я создаю экземпляр только один объект один раз, вместо того, чтобы делать это каждый раз менять датчики. Правильно ли я полагаю, что это имеет более низкое использование ОЗУ, чем предыдущий метод? Есть ли более эффективный/лучший способ выполнить эту задачу?

+0

Почему вы не можете просто создать очередь для обмена данными btw sensor и db writing thread? Таким образом, вы можете создать только один runnable для потока записи, который в бесконечном цикле принимает данные из очереди и сохраняет их. –

+0

Я думал, что в моем втором примере я только создаю 1 runnable для фонового потока? Может быть, я не понимаю, что вы имеете в виду, но я думал, что 'executor.execute()' добавляет задачи в очередь, где каждая задача в очереди выполняет сохранение? – Simon

+0

Да, вы правильно поняли. Ваш второй пример будет работать, я полагаю, если вы правильно синхронизируете данные общего доступа (я имею в виду код, который вы опустили, где события из датчика хранятся в каком-либо объекте, а затем читаются автором). –

ответ

1

Создание нового экземпляра Runnable каждые 10 мс наверняка вызовет сборщик мусора чаще и может повлиять на производительность вашего приложения. Ваш второй подход, на мой взгляд, намного лучше.

Смежные вопросы