Index: src/runtime-profiler.cc |
diff --git a/src/runtime-profiler.cc b/src/runtime-profiler.cc |
index 3c0490f8ded66615de1349f889a5f3b9a401a159..051dc51193b83c9a36411a31887e308a7f1c8448 100644 |
--- a/src/runtime-profiler.cc |
+++ b/src/runtime-profiler.cc |
@@ -68,18 +68,12 @@ class PendingListNode : public Malloced { |
}; |
-enum SamplerState { |
- IN_NON_JS_STATE = 0, |
- IN_JS_STATE = 1 |
-}; |
- |
- |
// Optimization sampler constants. |
static const int kSamplerFrameCount = 2; |
static const int kSamplerFrameWeight[kSamplerFrameCount] = { 2, 1 }; |
static const int kSamplerWindowSize = 16; |
-static const int kSamplerTicksBetweenThresholdAdjustment = 32; |
+static const int kSamplerTicksDelta = 32; |
static const int kSamplerThresholdInit = 3; |
static const int kSamplerThresholdMin = 1; |
@@ -94,11 +88,6 @@ static const int kSizeLimit = 1500; |
static int sampler_threshold = kSamplerThresholdInit; |
static int sampler_threshold_size_factor = kSamplerThresholdSizeFactorInit; |
-static int sampler_ticks_until_threshold_adjustment = |
- kSamplerTicksBetweenThresholdAdjustment; |
- |
-// The ratio of ticks spent in JS code in percent. |
-static Atomic32 js_ratio; |
// The JSFunctions in the sampler window are not GC safe. Old-space |
// pointers are not cleared during mark-sweep collection and therefore |
@@ -272,71 +261,40 @@ void RuntimeProfiler::OptimizeNow() { |
// have a sample of the function, we mark it for optimizations |
// (eagerly or lazily). |
JSFunction* samples[kSamplerFrameCount]; |
- int sample_count = 0; |
- int frame_count = 0; |
+ int count = 0; |
for (JavaScriptFrameIterator it; |
- frame_count++ < kSamplerFrameCount && !it.done(); |
+ count < kSamplerFrameCount && !it.done(); |
it.Advance()) { |
JavaScriptFrame* frame = it.frame(); |
JSFunction* function = JSFunction::cast(frame->function()); |
- |
- // Adjust threshold each time we have processed |
- // a certain number of ticks. |
- if (sampler_ticks_until_threshold_adjustment > 0) { |
- sampler_ticks_until_threshold_adjustment--; |
- if (sampler_ticks_until_threshold_adjustment <= 0) { |
- // If the threshold is not already at the minimum |
- // modify and reset the ticks until next adjustment. |
- if (sampler_threshold > kSamplerThresholdMin) { |
- sampler_threshold -= kSamplerThresholdDelta; |
- sampler_ticks_until_threshold_adjustment = |
- kSamplerTicksBetweenThresholdAdjustment; |
- } |
- } |
+ int function_size = function->shared()->SourceSize(); |
+ int threshold_size_factor; |
+ if (function_size > kSizeLimit) { |
+ threshold_size_factor = sampler_threshold_size_factor; |
+ } else { |
+ threshold_size_factor = 1; |
} |
+ int threshold = sampler_threshold * threshold_size_factor; |
+ samples[count++] = function; |
if (function->IsMarkedForLazyRecompilation()) { |
Code* unoptimized = function->shared()->code(); |
int nesting = unoptimized->allow_osr_at_loop_nesting_level(); |
if (nesting == 0) AttemptOnStackReplacement(function); |
int new_nesting = Min(nesting + 1, Code::kMaxLoopNestingMarker); |
unoptimized->set_allow_osr_at_loop_nesting_level(new_nesting); |
- } |
- |
- // Do not record non-optimizable functions. |
- if (!IsOptimizable(function)) continue; |
- samples[sample_count++] = function; |
- |
- int function_size = function->shared()->SourceSize(); |
- int threshold_size_factor = (function_size > kSizeLimit) |
- ? sampler_threshold_size_factor |
- : 1; |
- |
- int threshold = sampler_threshold * threshold_size_factor; |
- int current_js_ratio = NoBarrier_Load(&js_ratio); |
- |
- // Adjust threshold depending on the ratio of time spent |
- // in JS code. |
- if (current_js_ratio < 20) { |
- // If we spend less than 20% of the time in JS code, |
- // do not optimize. |
- continue; |
- } else if (current_js_ratio < 75) { |
- // Below 75% of time spent in JS code, only optimize very |
- // frequently used functions. |
- threshold *= 3; |
- } |
- |
- if (LookupSample(function) >= threshold) { |
- Optimize(function, false, 0); |
- CompilationCache::MarkForEagerOptimizing(Handle<JSFunction>(function)); |
+ } else if (LookupSample(function) >= threshold) { |
+ if (IsOptimizable(function)) { |
+ Optimize(function, false, 0); |
+ CompilationCache::MarkForEagerOptimizing(Handle<JSFunction>(function)); |
+ } |
} |
} |
// Add the collected functions as samples. It's important not to do |
// this as part of collecting them because this will interfere with |
// the sample lookup in case of recursive functions. |
- for (int i = 0; i < sample_count; i++) { |
+ for (int i = 0; i < count; i++) { |
AddSample(samples[i], kSamplerFrameWeight[i]); |
} |
} |
@@ -350,30 +308,7 @@ void RuntimeProfiler::OptimizeSoon(JSFunction* function) { |
} |
-static void UpdateStateRatio(SamplerState current_state) { |
- static const int kStateWindowSize = 128; |
- static SamplerState state_window[kStateWindowSize]; |
- static int state_window_position = 0; |
- static int state_counts[2] = { kStateWindowSize, 0 }; |
- |
- SamplerState old_state = state_window[state_window_position]; |
- state_counts[old_state]--; |
- state_window[state_window_position] = current_state; |
- state_counts[current_state]++; |
- ASSERT(IsPowerOf2(kStateWindowSize)); |
- state_window_position = (state_window_position + 1) & |
- (kStateWindowSize - 1); |
- NoBarrier_Store(&js_ratio, state_counts[IN_JS_STATE] * 100 / |
- kStateWindowSize); |
-} |
- |
- |
void RuntimeProfiler::NotifyTick() { |
- // Record state sample. |
- SamplerState state = Top::IsInJSState() |
- ? IN_JS_STATE |
- : IN_NON_JS_STATE; |
- UpdateStateRatio(state); |
StackGuard::RequestRuntimeProfilerTick(); |
} |
@@ -406,8 +341,6 @@ void RuntimeProfiler::Setup() { |
void RuntimeProfiler::Reset() { |
sampler_threshold = kSamplerThresholdInit; |
- sampler_ticks_until_threshold_adjustment = |
- kSamplerTicksBetweenThresholdAdjustment; |
sampler_threshold_size_factor = kSamplerThresholdSizeFactorInit; |
} |