Использование Logback и печатающие списки

Все эти ответы не очень полезны, потому что они чувствительны ко времени .

Проведя свое собственное исследование, я обнаружил, что simplejson действительно быстрее встроенного, , если вы будете обновлять его до последней версии.

pip/easy_install хотели установить 2.3.2 на Ubuntu 12.04, но после обнаружения последней версии simplejson на самом деле 3.3.0, поэтому я обновил ее и перезапустил тесты времени.

  • simplejson примерно в 3 раза быстрее, чем встроенный json при нагрузках
  • simplejson примерно на 30% быстрее, чем встроенный json на свалках

Отказ от ответственности:

Вышеприведенные утверждения приведены в python-2.7.3 и simplejson 3.3.0 (с ускорениями c). Чтобы убедиться, что мой ответ также не чувствителен ко времени, вам следует ] запустить свои собственные тесты , чтобы проверить, так как они сильно различаются между версиями; нет простого ответа, который не чувствителен ко времени.

Как узнать, включены ли ускорения C в simplejson:

import simplejson
# If this is True, then c speedups are enabled.
print bool(getattr(simplejson, '_speedups', False))

ОБНОВЛЕНИЕ: Я недавно наткнулся на библиотеку ujson , которая выполняет ~ 3x быстрее, чем simplejson с некоторыми основными тестами.

7
задан Macarse 26 June 2009 в 19:16
поделиться

1 ответ

Используя AspectJ и log4j , вы можете использовать это. Скомпилируйте свой код с помощью компилятора ajc вместо javac, а затем запустите его в обычном режиме с исполняемым файлом java.

Вам необходимо иметь в пути к классам файлы aspectjrt.jar и log4j.jar.

import org.aspectj.lang.*;
import org.apache.log4j.*;

public aspect TraceMethodCalls {
    Logger logger = Logger.getLogger("trace");

    TraceMethodCalls() {
        logger.setLevel(Level.ALL);
    }

    pointcut traceMethods()
        //give me all method calls of every class with every visibility
        : (execution(* *.*(..))
        //give me also constructor calls
        || execution(*.new(..)))
        //stop recursion don't get method calls in this aspect class itself
        && !within(TraceMethodCalls);

    //advice before: do something before method is really executed
    before() : traceMethods() {
        if (logger.isEnabledFor(Level.INFO)) {
            //get info about captured method and log it
            Signature sig = thisJoinPointStaticPart.getSignature();
            logger.log(Level.INFO,
                        "Entering ["
                        + sig.getDeclaringType().getName() + "."
                        + sig.getName() + "]");
        }
    }
}

Ознакомьтесь с документацией AspectJ, чтобы узнать, как изменить TraceMethodCalls вызывает.

// e.g. just caputre public method calls
// change this
: (execution(* *.*(..))
// to this
: (execution(public * *.*(..))

Что касается

. Также я хочу распечатать список в .log в этой строке: this.logger.debug ("names: {}", xxxxx);

По умолчанию slf4j / logback поддерживает это. Просто введите

logger.debug("names: {}", names);

, например

List<String> list = new ArrayList<String>();
list.add("Test1"); list.add("Test2"); list.add("Test3");
logger.debug("names: {}", list);

//produces
//xx::xx.xxx [main] DEBUG [classname] - names: [Test1, Test2, Test3]

Или вы хотите что-то особенное?

8
ответ дан 7 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

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