diff --git a/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc b/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc index 4820e6295f..c6d0c88280 100644 --- a/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc +++ b/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc @@ -44,7 +44,7 @@ AimdRateControl::AimdRateControl() beta_(0.85f), rtt_(kDefaultRttMs), time_of_last_log_(-1), - in_experiment_(AdaptiveThresholdExperimentIsEnabled()) {} + in_experiment_(!AdaptiveThresholdExperimentIsDisabled()) {} void AimdRateControl::SetMinBitrate(int min_bitrate_bps) { min_configured_bitrate_bps_ = min_bitrate_bps; diff --git a/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc b/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc index 0acd7c29c5..042fe9aa2a 100644 --- a/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc +++ b/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc @@ -30,17 +30,19 @@ namespace webrtc { const char kAdaptiveThresholdExperiment[] = "WebRTC-AdaptiveBweThreshold"; const char kEnabledPrefix[] = "Enabled"; const size_t kEnabledPrefixLength = sizeof(kEnabledPrefix) - 1; -const size_t kMinExperimentLength = kEnabledPrefixLength + 3; +const char kDisabledPrefix[] = "Disabled"; +const size_t kDisabledPrefixLength = sizeof(kDisabledPrefix) - 1; const double kMaxAdaptOffsetMs = 15.0; const double kOverUsingTimeThreshold = 10; -bool AdaptiveThresholdExperimentIsEnabled() { +bool AdaptiveThresholdExperimentIsDisabled() { std::string experiment_string = webrtc::field_trial::FindFullName(kAdaptiveThresholdExperiment); + const size_t kMinExperimentLength = kDisabledPrefixLength; if (experiment_string.length() < kMinExperimentLength) return false; - return experiment_string.substr(0, kEnabledPrefixLength) == kEnabledPrefix; + return experiment_string.substr(0, kDisabledPrefixLength) == kDisabledPrefix; } // Gets thresholds from the experiment name following the format @@ -48,14 +50,20 @@ bool AdaptiveThresholdExperimentIsEnabled() { bool ReadExperimentConstants(double* k_up, double* k_down) { std::string experiment_string = webrtc::field_trial::FindFullName(kAdaptiveThresholdExperiment); + const size_t kMinExperimentLength = kEnabledPrefixLength + 3; + if (experiment_string.length() < kMinExperimentLength || + experiment_string.substr(0, kEnabledPrefixLength) != kEnabledPrefix) + return false; return sscanf(experiment_string.substr(kEnabledPrefixLength + 1).c_str(), "%lf,%lf", k_up, k_down) == 2; } OveruseDetector::OveruseDetector(const OverUseDetectorOptions& options) - : in_experiment_(AdaptiveThresholdExperimentIsEnabled()), - k_up_(0.01), - k_down_(0.00018), + // Experiment is on by default, but can be disabled with finch by setting + // the field trial string to "WebRTC-AdaptiveBweThreshold/Disabled/". + : in_experiment_(!AdaptiveThresholdExperimentIsDisabled()), + k_up_(0.004), + k_down_(0.00006), overusing_time_threshold_(100), options_(options), threshold_(12.5), @@ -64,7 +72,7 @@ OveruseDetector::OveruseDetector(const OverUseDetectorOptions& options) time_over_using_(-1), overuse_counter_(0), hypothesis_(kBwNormal) { - if (in_experiment_) + if (!AdaptiveThresholdExperimentIsDisabled()) InitializeExperiment(); } diff --git a/webrtc/modules/remote_bitrate_estimator/overuse_detector.h b/webrtc/modules/remote_bitrate_estimator/overuse_detector.h index 56e9c14206..ce61e3b4d9 100644 --- a/webrtc/modules/remote_bitrate_estimator/overuse_detector.h +++ b/webrtc/modules/remote_bitrate_estimator/overuse_detector.h @@ -20,7 +20,7 @@ namespace webrtc { enum RateControlRegion; -bool AdaptiveThresholdExperimentIsEnabled(); +bool AdaptiveThresholdExperimentIsDisabled(); class OveruseDetector { public: @@ -45,7 +45,7 @@ class OveruseDetector { void UpdateThreshold(double modified_offset, int64_t now_ms); void InitializeExperiment(); - const bool in_experiment_; + bool in_experiment_; double k_up_; double k_down_; double overusing_time_threshold_; diff --git a/webrtc/modules/remote_bitrate_estimator/overuse_detector_unittest.cc b/webrtc/modules/remote_bitrate_estimator/overuse_detector_unittest.cc index 50909ebd01..c72ae71ce4 100644 --- a/webrtc/modules/remote_bitrate_estimator/overuse_detector_unittest.cc +++ b/webrtc/modules/remote_bitrate_estimator/overuse_detector_unittest.cc @@ -195,7 +195,7 @@ TEST_F(OveruseDetectorTest, SimpleOveruse2000Kbit30fps) { EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(8, frames_until_overuse); + EXPECT_EQ(5, frames_until_overuse); } TEST_F(OveruseDetectorTest, SimpleOveruse100kbit10fps) { @@ -210,7 +210,7 @@ TEST_F(OveruseDetectorTest, SimpleOveruse100kbit10fps) { EXPECT_EQ(0, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(6, frames_until_overuse); + EXPECT_EQ(5, frames_until_overuse); } TEST_F(OveruseDetectorTest, DISABLED_OveruseWithHighVariance100Kbit10fps) { @@ -302,7 +302,7 @@ TEST_F(OveruseDetectorTest, OveruseWithLowVariance2000Kbit30fps) { } // Simulate a higher send pace, that is too high. // Total build up of 30 ms. - for (int j = 0; j < 5; ++j) { + for (int j = 0; j < 3; ++j) { UpdateDetector(rtp_timestamp, now_ms_, packet_size); UpdateDetector(rtp_timestamp, now_ms_, packet_size); UpdateDetector(rtp_timestamp, now_ms_, packet_size); @@ -331,10 +331,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance30Kbit3fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(1, unique_overuse); + EXPECT_EQ(56, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(13, frames_until_overuse); + EXPECT_EQ(430, frames_until_overuse); } TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift30Kbit3fps) { @@ -345,7 +345,7 @@ TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift30Kbit3fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(1, unique_overuse); + EXPECT_EQ(56, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); EXPECT_EQ(4, frames_until_overuse); @@ -359,10 +359,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVariance30Kbit3fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(1, unique_overuse); + EXPECT_EQ(77, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(32, frames_until_overuse); + EXPECT_EQ(430, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift30Kbit3fps) { @@ -373,7 +373,7 @@ TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift30Kbit3fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(1, unique_overuse); + EXPECT_EQ(77, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); EXPECT_EQ(4, frames_until_overuse); @@ -393,10 +393,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance100Kbit5fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(45, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(13, frames_until_overuse); + EXPECT_EQ(32, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -413,7 +413,7 @@ TEST_F(OveruseDetectorTest, MAYBE_HighGaussianVariance100Kbit5fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(1, unique_overuse); + EXPECT_EQ(70, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); EXPECT_EQ(32, frames_until_overuse); @@ -433,7 +433,7 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance100Kbit10fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(1, unique_overuse); + EXPECT_EQ(33, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); EXPECT_EQ(13, frames_until_overuse); @@ -453,10 +453,10 @@ TEST_F(OveruseDetectorTest, MAYBE_HighGaussianVariance100Kbit10fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(45, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(32, frames_until_overuse); + EXPECT_EQ(31, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -473,10 +473,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance300Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(25, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(15, frames_until_overuse); + EXPECT_EQ(13, frames_until_overuse); } TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift300Kbit30fps) { @@ -487,10 +487,10 @@ TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift300Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(25, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(6, frames_until_overuse); + EXPECT_EQ(4, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVariance300Kbit30fps) { @@ -501,10 +501,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVariance300Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(46, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(41, frames_until_overuse); + EXPECT_EQ(31, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift300Kbit30fps) { @@ -515,10 +515,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift300Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(46, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(10, frames_until_overuse); + EXPECT_EQ(6, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -535,10 +535,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance1000Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(25, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(15, frames_until_overuse); + EXPECT_EQ(13, frames_until_overuse); } TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift1000Kbit30fps) { @@ -549,10 +549,10 @@ TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift1000Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(25, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(6, frames_until_overuse); + EXPECT_EQ(4, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVariance1000Kbit30fps) { @@ -563,10 +563,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVariance1000Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(45, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(41, frames_until_overuse); + EXPECT_EQ(31, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift1000Kbit30fps) { @@ -577,10 +577,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift1000Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(45, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(10, frames_until_overuse); + EXPECT_EQ(6, frames_until_overuse); } #if defined(WEBRTC_ANDROID) @@ -597,10 +597,10 @@ TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance2000Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(25, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(15, frames_until_overuse); + EXPECT_EQ(13, frames_until_overuse); } TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift2000Kbit30fps) { @@ -611,10 +611,10 @@ TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift2000Kbit30fps) { int sigma_ms = 3; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(25, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(6, frames_until_overuse); + EXPECT_EQ(4, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVariance2000Kbit30fps) { @@ -625,10 +625,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVariance2000Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(45, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(41, frames_until_overuse); + EXPECT_EQ(31, frames_until_overuse); } TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift2000Kbit30fps) { @@ -639,10 +639,10 @@ TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift2000Kbit30fps) { int sigma_ms = 10; int unique_overuse = Run100000Samples(packets_per_frame, packet_size, frame_duration_ms, sigma_ms); - EXPECT_EQ(0, unique_overuse); + EXPECT_EQ(45, unique_overuse); int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, frame_duration_ms, sigma_ms, drift_per_frame_ms); - EXPECT_EQ(10, frames_until_overuse); + EXPECT_EQ(6, frames_until_overuse); } class OveruseDetectorExperimentTest : public OveruseDetectorTest { diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc index 6bf2421eab..c1a498806b 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc @@ -39,19 +39,19 @@ TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, RateIncreaseRtpTimestamps) { } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropOneStream) { - CapacityDropTestHelper(1, false, 567); + CapacityDropTestHelper(1, false, 700); } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropOneStreamWrap) { - CapacityDropTestHelper(1, true, 567); + CapacityDropTestHelper(1, true, 700); } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropTwoStreamsWrap) { - CapacityDropTestHelper(2, true, 600); + CapacityDropTestHelper(2, true, 633); } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropThreeStreamsWrap) { - CapacityDropTestHelper(3, true, 567); + CapacityDropTestHelper(3, true, 633); } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropThirteenStreamsWrap) { @@ -59,11 +59,11 @@ TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropThirteenStreamsWrap) { } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropNineteenStreamsWrap) { - CapacityDropTestHelper(19, true, 633); + CapacityDropTestHelper(19, true, 667); } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropThirtyStreamsWrap) { - CapacityDropTestHelper(30, true, 600); + CapacityDropTestHelper(30, true, 667); } TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, TestTimestampGrouping) { diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc index cb0907ff9d..4bf4267f73 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc @@ -47,11 +47,11 @@ TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropOneStreamWrap) { } TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropTwoStreamsWrap) { - CapacityDropTestHelper(2, true, 567); + CapacityDropTestHelper(2, true, 767); } TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropThreeStreamsWrap) { - CapacityDropTestHelper(3, true, 734); + CapacityDropTestHelper(3, true, 767); } TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropThirteenStreamsWrap) { diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc index 1fcbd3c33e..d67c538a5b 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc @@ -467,7 +467,7 @@ void RemoteBitrateEstimatorTest::CapacityDropTestHelper( uint32_t bitrate_bps = SteadyStateRun( kDefaultSsrc, steady_state_time * kFramerate, kStartBitrate, kMinExpectedBitrate, kMaxExpectedBitrate, kInitialCapacityBps); - EXPECT_NEAR(kInitialCapacityBps, bitrate_bps, 110000u); + EXPECT_NEAR(kInitialCapacityBps, bitrate_bps, 130000u); bitrate_observer_->Reset(); // Reduce the capacity and verify the decrease time.