#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
'programing' 카테고리의 다른 글
MySQL 서버 시작 오류 'PID 파일을 업데이트하지 않고 서버가 종료되었습니다' (0) | 2022.11.03 |
---|---|
'상수'를 공유하기 위한 Java 정적 필드가 있는 인터페이스 (0) | 2022.10.25 |
GitHub에서 Maven 종속성을 로드하는 중 (0) | 2022.10.25 |
Angular.js와 함께 Require.js를 사용하는 것이 의미가 있습니까? (0) | 2022.10.25 |
VueJ: 참조 방법컴포넌트 데이터 속성에 $store (0) | 2022.10.25 |