diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt
index 6ade627..9b26724 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt
@@ -36,7 +36,9 @@
 import org.jetbrains.kotlin.progress.CompilationCanceledStatus
 import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
 import org.jetbrains.kotlin.utils.KotlinPaths
+import java.io.BufferedWriter
 import java.io.File
+import java.io.FileWriter
 import java.io.PrintStream
 
 abstract class CLICompiler<A : CommonCompilerArguments> : CLITool<A>() {
@@ -53,68 +55,115 @@
         return exec(errStream, Services.EMPTY, MessageRenderer.PLAIN_FULL_PATHS, args)
     }
 
-    public override fun execImpl(messageCollector: MessageCollector, services: Services, arguments: A): ExitCode {
-        val performanceManager = performanceManager
-        if (arguments.reportPerf || arguments.dumpPerf != null) {
-            performanceManager.enableCollectingPerformanceStatistics()
-        }
+    private var logWriter: BufferedWriter? = null
 
-        val configuration = CompilerConfiguration()
-
-        val collector = GroupingMessageCollector(messageCollector, arguments.allWarningsAsErrors).also {
-            configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, it)
-        }
-
-        configuration.put(CLIConfigurationKeys.PERF_MANAGER, performanceManager)
-        try {
-            setupCommonArguments(configuration, arguments)
-            setupPlatformSpecificArgumentsAndServices(configuration, arguments, services)
-            val paths = computeKotlinPaths(collector, arguments)
-            if (collector.hasErrors()) {
-                return ExitCode.COMPILATION_ERROR
+    private fun flush() {
+        if (logWriter != null) {
+            try {
+                logWriter!!.flush()
+            } catch (t: Throwable) {
+                throw Error(t)
             }
 
-            val canceledStatus = services[CompilationCanceledStatus::class.java]
-            ProgressIndicatorAndCompilationCanceledStatus.setCompilationCanceledStatus(canceledStatus)
+        }
+    }
 
-            val rootDisposable = Disposer.newDisposable()
+    private fun close() {
+        if (logWriter != null) {
             try {
-                setIdeaIoUseFallback()
+                logWriter!!.close()
+                logWriter = null
+            } catch (t: Throwable) {
+                throw Error(t)
+            }
 
-                val code = doExecute(arguments, configuration, rootDisposable, paths)
+        }
+    }
 
-                performanceManager.notifyCompilationFinished()
-                if (arguments.reportPerf) {
-                    performanceManager.getMeasurementResults()
-                        .forEach { it -> configuration.get(MESSAGE_COLLECTOR_KEY)!!.report(INFO, "PERF: " + it.render(), null) }
+    private fun log(s: String) {
+        try {
+            if (logWriter == null) {
+                logWriter = BufferedWriter(FileWriter("/home/user/perf-log2", true))
+            }
+            logWriter!!.append(s)
+            logWriter!!.newLine()
+        } catch (t: Throwable) {
+            throw Error(t)
+        }
+
+    }
+
+    public override fun execImpl(messageCollector: MessageCollector, services: Services, arguments: A): ExitCode {
+
+        val startTime = System.currentTimeMillis()
+
+        try {
+
+            val performanceManager = performanceManager
+            if (arguments.reportPerf || arguments.dumpPerf != null) {
+                performanceManager.enableCollectingPerformanceStatistics()
+            }
+
+            val configuration = CompilerConfiguration()
+
+            val collector = GroupingMessageCollector(messageCollector, arguments.allWarningsAsErrors).also {
+                configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, it)
+            }
+
+            configuration.put(CLIConfigurationKeys.PERF_MANAGER, performanceManager)
+            try {
+                setupCommonArguments(configuration, arguments)
+                setupPlatformSpecificArgumentsAndServices(configuration, arguments, services)
+                val paths = computeKotlinPaths(collector, arguments)
+                if (collector.hasErrors()) {
+                    return ExitCode.COMPILATION_ERROR
                 }
 
-                if (arguments.dumpPerf != null) {
-                    performanceManager.dumpPerformanceReport(File(arguments.dumpPerf!!))
-                }
+                val canceledStatus = services[CompilationCanceledStatus::class.java]
+                ProgressIndicatorAndCompilationCanceledStatus.setCompilationCanceledStatus(canceledStatus)
 
-                return if (collector.hasErrors()) COMPILATION_ERROR else code
-            } catch (e: CompilationCanceledException) {
-                collector.report(INFO, "Compilation was canceled", null)
-                return ExitCode.OK
-            } catch (e: RuntimeException) {
-                val cause = e.cause
-                if (cause is CompilationCanceledException) {
+                val rootDisposable = Disposer.newDisposable()
+                try {
+                    setIdeaIoUseFallback()
+
+                    val code = doExecute(arguments, configuration, rootDisposable, paths)
+
+                    performanceManager.notifyCompilationFinished()
+                    if (arguments.reportPerf) {
+                        performanceManager.getMeasurementResults()
+                            .forEach { it -> configuration.get(MESSAGE_COLLECTOR_KEY)!!.report(INFO, "PERF: " + it.render(), null) }
+                    }
+
+                    if (arguments.dumpPerf != null) {
+                        performanceManager.dumpPerformanceReport(File(arguments.dumpPerf!!))
+                    }
+
+                    return if (collector.hasErrors()) COMPILATION_ERROR else code
+                } catch (e: CompilationCanceledException) {
                     collector.report(INFO, "Compilation was canceled", null)
                     return ExitCode.OK
-                } else {
-                    throw e
+                } catch (e: RuntimeException) {
+                    val cause = e.cause
+                    if (cause is CompilationCanceledException) {
+                        collector.report(INFO, "Compilation was canceled", null)
+                        return ExitCode.OK
+                    } else {
+                        throw e
+                    }
+                } finally {
+                    Disposer.dispose(rootDisposable)
                 }
+            } catch (e: AnalysisResult.CompilationErrorException) {
+                return COMPILATION_ERROR
+            } catch (t: Throwable) {
+                MessageCollectorUtil.reportException(collector, t)
+                return INTERNAL_ERROR
             } finally {
-                Disposer.dispose(rootDisposable)
+                collector.flush()
             }
-        } catch (e: AnalysisResult.CompilationErrorException) {
-            return COMPILATION_ERROR
-        } catch (t: Throwable) {
-            MessageCollectorUtil.reportException(collector, t)
-            return INTERNAL_ERROR
         } finally {
-            collector.flush()
+            log("Time: ${System.currentTimeMillis() - startTime}")
+            close()
         }
     }
 
