2016-12-14 9 views
0

Webプロジェクトには、2000個以上のJSファイルがフォーマットされています。私は、Googleクロージャコンパイラがそうであることを知っていることを知っています。実際には、JSファイル全体のフォーマット用のツールを書くために使っています。私の要件は、書式設定されたJSファイルが元のファイルと同じ場所に置き換わることです。JavaScriptファイルをフォーマットするための高性能Java APIはありますか?

私が見つけたファイルがある場合には、スレッドがコマンドに

java -jar compiler.jar --js C:/project/xyz/abc.js --js_output_file C:/project/xyz/abc.js` 

、元のJSファイル(ABCを実行するための責任を負うことになります、Webプロジェクト内の各JSファイルを検索するためにJavaプログラムを書きました.js)がフォーマットされます。

しかし、私はこの方法がそれほど効率的ではないことを知ります。私はExecutorServiceを使ってスレッドを実行しています。各スレッドはファイルの書式設定を行うのに約10秒かかります。それで、2000以上のファイルを完成させるのにどれくらいの時間がかかるか想像できます。

以下はコードスニペットです。

ExecutorService executor = Executors.newFixedThreadPool(10); 
// ... 
for(File jsFile : root.listFiles()) { 
    Runnable formatThread = new FormatThread(jsFilePath.getAbsolutePath()); 
    //execute command "java -jar compiler.jar in run(), handled by ProcessBuilder 
    executor.execute(formatThread); 
} 

私はスレッドプールのサイズを増やそうとしましたが、プログラムが開始された後すぐにCPUとメモリが消費されてしまいます。

私の質問は、Javaで書かれたアプリケーションでファイルのような大規模な数をフォーマットするための効率的な方法は何ですか

  1. ですか?
  2. 私のプログラム内のExecutorServiceの使用法は、私のユースケースに適していますか?
  3. 他のJava APIであれば、Javascriptファイルをすばやくフォーマットできますか?実際に私が必要とするのは、空の行とユーザーコメントを削除するだけですが、ファイルを圧縮する必要はありません。
+0

あなたは本当に複数の無関係な質問 – byxor

+0

'実際に私は必要なものだけで空行を削除され、ユーザーのcomments'がコードの書式設定のための良好な要件のような音はありませんを組み合わせるべきではありません。 – Azodious

+0

私は現在、 'crem'と呼ばれるプロジェクトで、ソースコードからコメントを削除できるようにしています。今のところJavaはサポートされている唯一の言語ですが、私はまだリリースをしていないので、ここで宣伝したくありません。あなたはgithubでそれを見つけることができます。 – byxor

答えて

1

コマンドラインでこれらのタスクをすべて開始すると、新しいjvmを起動する必要があるため、膨大なオーバーヘッドが発生します。

あなたががjarファイルのマニフェスト形式のJavaコードからメインクラス(私の知る限りcom.google.javascript.jscomp.CommandLineRunner)のmain方法を実行することができます。

for(File jsFile : root.listFiles()) { 
    Runnable formatThread =() -> com.google.javascript.jscomp.CommandLineRunner.main(new String[] {"--js", jsFilePath.getAbsolutePath(), "--js_output_file", jsFilePath.getAbsolutePath()})); 
    executor.execute(formatThread); 
} 

でもAPIを呼び出すより効率的な方法があるかもしれません...

編集:

APIは、別の方法でより良い呼び出されます。例えば

CompilerOptions options = new CompilerOptions(); 
CompilationLevel.ADVANCED_OPTIMIZATIONS.setOptionsForCompilationLevel(options); 
options.setCheckGlobalThisLevel(CheckLevel.OFF); 
options.setOutputCharset("utf-8"); 
com.google.javascript.jscomp.Compiler compiler = new com.google.javascript.jscomp.Compiler(System.err); 
compiler.disableThreads(); 
compiler.compile(SourceFile.fromFile(externsFile), 
     SourceFile.fromFile(jsFile), 
     options); 
String result = compiler.toSource(); 
// TODO: write result to file 
関連する問題