Из источников java, похоже, что он попадает в собственный код. Является ли стоимость примерно эквивалентной показателю волатильности или ему нужно приобрести блокировку какого-либо типа?Какова стоимость исполнения вызова Thread.isInterrupted()?
ответ
Thread.isInterrupted()
- очень дешевая функция для вызова. Там еще несколько указаний, но все звонки достаточно быстры. Подводя итог:
Должна быть обеспечена возможность для Java подражать
Thread.currentThread().isInterrupted()
выполняя двойной косвенностьThread::current()->_osthread->_interrupted
.
bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
assert(Thread::current() == thread || Threads_lock->owned_by_self(),
"possibility of dangling Thread pointer");
OSThread* osthread = thread->osthread();
bool interrupted = osthread->interrupted();
if (interrupted && clear_interrupted) {
osthread->set_interrupted(false);
// consider thread->_SleepEvent->reset() ... optional optimization
}
return interrupted;
}
OSThread
реализуется следующим образом:
volatile jint _interrupted; // Thread.isInterrupted state
// Note: _interrupted must be jint, so that Java intrinsics can access it.
// The value stored there must be either 0 or 1. It must be possible
// for Java to emulate Thread.currentThread().isInterrupted() by performing
// the double indirection Thread::current()->_osthread->_interrupted.
....
volatile bool interrupted() const { return _interrupted != 0; }
Я не знаю, получает ли он блокировку или нет, но я побежал быстрый тест, и для меня isInterrupted()
примерно в 100 раз медленнее, чем чтение летучего переменного , Теперь я не могу сказать, будет ли это иметь значение или нет в вашем приложении.
Не могли бы вы опубликовать контрольный показатель, который вы использовали? –
@ Майкл: Я провел очень грубое тестирование. В основном просто цикл за несколько миллионов раз и в вызове цикла isInterrupted() для первого теста и чтение переменной для второго. Никаких других потоков. Я также сохранил ссылку на значение, поэтому цикл не будет оптимизирован. – JRL
Остерегайтесь микро-тестов! Особенно на JVM. Есть много факторов, которые могут легко исказить результаты. Идеальная вещь - это реализовать это в своем приложении и проверить его на самом деле. Подробнее см. На странице http://www.ibm.com/developerworks/java/library/j-jtp02225.html. – mdma
- 1. Какова фактическая стоимость исполнения динамической отправки?
- 2. Какова стоимость вызова array.length
- 3. Какова стоимость исполнения резервного механизма Magento?
- 4. Какова стоимость исполнения примитивно-действующих структур?
- 5. Какова стоимость исполнения с IOC (asp.net mvc)?
- 6. Какова стоимость исполнения коммутатора процесса Win32?
- 7. Какова стоимость/сложность вызова функции String.indexOf()
- 8. Какова стоимость создания объекта
- 9. Какова фактическая стоимость «line.separator»?
- 10. Какова стоимость #define?
- 11. Какова стоимость выполнения Swift?
- 12. Какова стоимость распаковки коллекций?
- 13. Какова стоимость трафика Heroku?
- 14. Какова стоимость '$ (this)'?
- 15. Какова стоимость неиспользуемого sproc
- 16. Какова стоимость заявления
- 17. Какова добавленная стоимость BDD?
- 18. Какова «стоимость» отображения .NET?
- 19. Какова стоимость вызова виртуальной функции не полиморфным способом?
- 20. Какова стоимость синхронизации вызова синхронизированного метода из синхронизированного метода?
- 21. Преобразование типов для сортировки: любая стоимость исполнения?
- 22. Стоимость исполнения пользовательской функции LinqToSql в запросе
- 23. Erlang: стоимость исполнения для рекурсивного цикла
- 24. Какова модель линейного исполнения в Метеор?
- 25. Какова стоимость включения профилирования памяти?
- 26. Какова возвращаемая стоимость тройной операции «?:»?
- 27. Какова стоимость доступа к памяти?
- 28. APNS - какова стоимость отправки сообщения?
- 29. Какова должна быть стоимость androidboot.mode?
- 30. Какова стоимость попыток захвата блоков?
Я считаю, что нативный код является открытым исходным кодом, так что вы можете просто проверить, что там происходит. – pajton