programing

#ifdef #ifndef(자바어)

itsource 2022. 10. 25. 22:00
반응형

#ifdef #ifndef(자바어)

C++의 #ifdef #ifndef와 같이 자바에서 컴파일 시간 조건을 만들 수 있는 방법이 있는지 의문입니다.

문제는 Java로 작성된 알고리즘으로 실행시간이 개선된다는 것입니다.따라서 각각의 개선사항을 사용할 때 얼마나 많은 시간을 절약할 수 있는지 측정하고자 합니다.

현재 실행 시간 동안 어떤 개선 기능을 사용해야 하는지 여부를 결정하기 위해 사용되는 부울 변수 세트가 있습니다.그러나 이러한 변수를 테스트하는 것조차 총 실행 시간에 영향을 미칩니다.

그래서 컴파일 시간 중에 어떤 프로그램을 컴파일해서 사용해야 하는지 방법을 찾고 싶습니다.

자바에서 할 줄 아는 사람 있어?아니면 누군가가 그런 방법이 없다는 것을 알고 있을지도 모른다(그것도 유용할 것이다).

private static final boolean enableFast = false;

// ...
if (enableFast) {
  // This is removed at compile time
}

위와 같은 조건은 컴파일 시 평가됩니다.대신 이것을 사용하면

private static final boolean enableFast = "true".equals(System.getProperty("fast"));

enableFast에 의존하는 조건은 JIT 컴파일러에 의해 평가됩니다.이것에 대한 오버헤드는 무시할 만하다.

javac은 도달할 수 없는 컴파일된 코드를 출력하지 않습니다.상수 값으로 설정된 최종 변수 사용#define및 표준if를 위한 스테이트먼트#ifdef.

javap을 사용하여 도달할 수 없는 코드가 출력 클래스 파일에 포함되어 있지 않음을 증명할 수 있습니다.예를 들어 다음 코드를 생각해 보겠습니다.

public class Test
{
   private static final boolean debug = false;

   public static void main(String[] args)
   {
       if (debug) 
       {
           System.out.println("debug was enabled");
       }
       else
       {
           System.out.println("debug was not enabled");
       }
   }
}

javap -c Test는 2개의 패스 중1개만 컴파일된 것을 나타내는 다음 출력을 나타냅니다(if 문이 컴파일되지 않은 경우).

public static void main(java.lang.String[]);
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #3; //String debug was not enabled
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return

해결책을 찾은 것 같아 훨씬 간단해
부울 변수를 "최종" 수식어로 정의하면 Java 컴파일러 자체가 문제를 해결합니다.이 상태를 테스트하면 어떤 결과가 나올지 미리 알고 있기 때문입니다.예를 들어 다음 코드입니다.

    boolean flag1 = true;
    boolean flag2 = false;
    int j=0;
    for(int i=0;i<1000000000;i++){
        if(flag1)
            if(flag2)
                j++;
            else
                j++;
        else
            if(flag2)
                j++;
            else
                j++;
    }

내 컴퓨터에서 약 3초 동안 실행됩니다.
그리고 이것은.

    final boolean flag1 = true;
    final boolean flag2 = false;
    int j=0;
    for(int i=0;i<1000000000;i++){
        if(flag1)
            if(flag2)
                j++;
            else
                j++;
        else
            if(flag2)
                j++;
            else
                j++;
    }

약 1초 동안 동작합니다.이 코드와 동시에

    int j=0;
    for(int i=0;i<1000000000;i++){
        j++;
    }

사용한 적은 없지만, 이것은 존재합니다.

JCPP는 C 프리프로세서의 완전한 준거 스탠드아론 순수 Java 구현입니다.이는 sablecc, antlr, JLex, CUP 등의 도구를 사용하여 Java에서 C-style 컴파일러를 작성하는 사용자에게 유용하게 사용됩니다.이 프로젝트는 GNU C 라이브러리의 소스 코드 대부분을 성공적으로 전처리하기 위해 사용되어 왔습니다.버전 1.2.5 이후에는 Apple Objective C 라이브러리를 전처리할 수도 있습니다.

http://www.anarres.org/projects/jcpp/

조건부 컴파일이 필요하고 Ant를 사용하는 경우 코드를 필터링하여 검색 및 치환할 수 있습니다.

예: http://weblogs.java.net/blog/schaefa/archive/2005/01/how_to_do_condi.html

를 들어 필터로 대체하여 수 있습니다.LOG.debug(...);/*LOG.debug(...);*/ 더 될 것입니다.if (LOG.isDebugEnabled()) { ... }좀 더 간결하게 말할 수 있는 것도 아니고

Maven을 사용하는 경우 여기서 설명하는 것과 유사한 기능이 있습니다.

를 다지관이라고 , 「다지관」이라고 하는 플러그 인을 할 수 .#ifdef ★★★★★★★★★★★★★★★★★」#define★★★★★★★★★★★★★★★★★★.

플러그인 URL: https://manifold.systems/

프리프로세서 정보:https://github.com/manifold-systems/manifold/tree/master/manifold-deps-parent/manifold-preprocessor

PS: 저는 그들과 제휴하고 있지 않습니다.그냥 사용하고 있습니다.워크플로우에 큰 도움이 됩니다(Java 개발에서는 일반적인 것은 아닙니다).

공장 패턴을 사용하여 클래스의 구현 간을 전환하시겠습니까?

오브젝트 작성 시간은 이제 문제가 되지 않습니다.장기간에 걸쳐 평균을 낼 때, 소비되는 시간의 가장 큰 구성요소는 이제 메인 알고리즘이 되어야 합니다.

엄밀히 말하면, 달성하려고 하는 것을 실행하기 위해서 프리프로세서가 필요한 것은 아닙니다.물론 제가 제안한 방법 말고도 아마 당신의 요구를 충족시킬 수 있는 다른 방법이 있을 것입니다.

final static int appFlags = context.getApplicationInfo().flags;
final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0

언급URL : https://stackoverflow.com/questions/1813853/ifdef-ifndef-in-java

반응형