Unify sources for bindings more densely
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Oct 2019 05:53:17 +0000 (05:53 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Oct 2019 05:53:17 +0000 (05:53 +0000)
https://bugs.webkit.org/show_bug.cgi?id=202918

Reviewed by Simon Fraser.

Source/WebCore:

No new tests, just a build time speedup.
For me, this is a reliable 17% boost on the WebCore Build Time Benchmark.

* Scripts/generate-unified-sources.sh:
Use dense bundles for JS* and bindings/js/*.
This seems acceptable for a few reasons:

- most of the time building these files is spent parsing the exact
same set of JSC headers, because the generated bindings code ends
up including the same set of things

- the incremental build cost of bundling more bindings sources together
is small, because the JSC headers dominate the time

- folks will frequently have to rebuild all of the bindings (on every
pull, for example, because they indirectly include most JSC headers),
but rarely end up rebuilding only a single one (in my experience)

* bindings/js/ReadableStreamDefaultController.cpp:
(WebCore::readableStreamCallFunction):
(WebCore::ReadableStreamDefaultController::invoke):
(WebCore::callFunction): Deleted.
Deduplicate static functions that now get bundled together.

* platform/graphics/ca/PlatformCALayer.cpp:
(WebCore::PlatformCALayer::currentTimeToMediaTime):
* platform/graphics/ca/PlatformCALayer.h:
In older macOS SDKs, CABase.h included ApplicationServices.h, which
causes lots of trouble.

Source/WTF:

* Scripts/generate-unified-source-bundles.rb:
Add an option to separate and more densely unify sources that match
a given glob pattern.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251123 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/Scripts/generate-unified-source-bundles.rb
Source/WebCore/ChangeLog
Source/WebCore/Scripts/generate-unified-sources.sh
Source/WebCore/bindings/js/ReadableStreamDefaultController.cpp
Source/WebCore/platform/graphics/ca/PlatformCALayer.cpp
Source/WebCore/platform/graphics/ca/PlatformCALayer.h

index 5c3cfdf..7f2ab31 100644 (file)
@@ -1,3 +1,14 @@
+2019-10-14  Tim Horton  <timothy_horton@apple.com>
+
+        Unify sources for bindings more densely
+        https://bugs.webkit.org/show_bug.cgi?id=202918
+
+        Reviewed by Simon Fraser.
+
+        * Scripts/generate-unified-source-bundles.rb:
+        Add an option to separate and more densely unify sources that match
+        a given glob pattern.
+
 2019-10-14  Keith Rollin  <krollin@apple.com>
 
         Remove some support for < iOS 13
 2019-10-14  Keith Rollin  <krollin@apple.com>
 
         Remove some support for < iOS 13
index d352a7c..f556c1d 100644 (file)
@@ -55,10 +55,12 @@ def usage(message)
     puts "Generation options:"
     puts "--max-cpp-bundle-count               Use global sequential numbers for cpp bundle filenames and set the limit on the number"
     puts "--max-obj-c-bundle-count             Use global sequential numbers for Obj-C bundle filenames and set the limit on the number"
     puts "Generation options:"
     puts "--max-cpp-bundle-count               Use global sequential numbers for cpp bundle filenames and set the limit on the number"
     puts "--max-obj-c-bundle-count             Use global sequential numbers for Obj-C bundle filenames and set the limit on the number"
+    puts "--dense-bundle-filter                Densely bundle files matching the given path glob"
     exit 1
 end
 
 MAX_BUNDLE_SIZE = 8
     exit 1
 end
 
 MAX_BUNDLE_SIZE = 8
+MAX_DENSE_BUNDLE_SIZE = 64
 $derivedSourcesPath = nil
 $unifiedSourceOutputPath = nil
 $sourceTreePath = nil
 $derivedSourcesPath = nil
 $unifiedSourceOutputPath = nil
 $sourceTreePath = nil
@@ -69,6 +71,7 @@ $inputXCFilelistPath = nil
 $outputXCFilelistPath = nil
 $maxCppBundleCount = nil
 $maxObjCBundleCount = nil
 $outputXCFilelistPath = nil
 $maxCppBundleCount = nil
 $maxObjCBundleCount = nil
+$denseBundleFilters = []
 
 def log(text)
     $stderr.puts text if $verbose
 
 def log(text)
     $stderr.puts text if $verbose
@@ -85,7 +88,8 @@ GetoptLong.new(['--help', '-h', GetoptLong::NO_ARGUMENT],
                ['--input-xcfilelist-path', GetoptLong::REQUIRED_ARGUMENT],
                ['--output-xcfilelist-path', GetoptLong::REQUIRED_ARGUMENT],
                ['--max-cpp-bundle-count', GetoptLong::REQUIRED_ARGUMENT],
                ['--input-xcfilelist-path', GetoptLong::REQUIRED_ARGUMENT],
                ['--output-xcfilelist-path', GetoptLong::REQUIRED_ARGUMENT],
                ['--max-cpp-bundle-count', GetoptLong::REQUIRED_ARGUMENT],
-               ['--max-obj-c-bundle-count', GetoptLong::REQUIRED_ARGUMENT]).each {
+               ['--max-obj-c-bundle-count', GetoptLong::REQUIRED_ARGUMENT],
+               ['--dense-bundle-filter', GetoptLong::REQUIRED_ARGUMENT]).each {
     | opt, arg |
     case opt
     when '--help'
     | opt, arg |
     case opt
     when '--help'
@@ -113,6 +117,8 @@ GetoptLong.new(['--help', '-h', GetoptLong::NO_ARGUMENT],
         $maxCppBundleCount = arg.to_i
     when '--max-obj-c-bundle-count'
         $maxObjCBundleCount = arg.to_i
         $maxCppBundleCount = arg.to_i
     when '--max-obj-c-bundle-count'
         $maxObjCBundleCount = arg.to_i
+    when '--dense-bundle-filter'
+        $denseBundleFilters.push(arg)
     end
 }
 
     end
 }
 
@@ -194,6 +200,7 @@ class BundleManager
         @maxCount = max
         @extraFiles = []
         @currentDirectory = nil
         @maxCount = max
         @extraFiles = []
         @currentDirectory = nil
+        @lastBundlingPrefix = nil
     end
 
     def writeFile(file, text)
     end
 
     def writeFile(file, text)
@@ -241,13 +248,15 @@ class BundleManager
     def addFile(sourceFile)
         path = sourceFile.path
         raise "wrong extension: #{path.extname} expected #{@extension}" unless path.extname == ".#{@extension}"
     def addFile(sourceFile)
         path = sourceFile.path
         raise "wrong extension: #{path.extname} expected #{@extension}" unless path.extname == ".#{@extension}"
-        if (TopLevelDirectoryForPath(@currentDirectory) != TopLevelDirectoryForPath(path.dirname))
+        bundlePrefix, bundleSize = BundlePrefixAndSizeForPath(path)
+        if (@lastBundlingPrefix != bundlePrefix)
             log("Flushing because new top level directory; old: #{@currentDirectory}, new: #{path.dirname}")
             flush
             log("Flushing because new top level directory; old: #{@currentDirectory}, new: #{path.dirname}")
             flush
+            @lastBundlingPrefix = bundlePrefix
             @currentDirectory = path.dirname
             @bundleCount = 0 unless @maxCount
         end
             @currentDirectory = path.dirname
             @bundleCount = 0 unless @maxCount
         end
-        if @fileCount == MAX_BUNDLE_SIZE
+        if @fileCount >= bundleSize
             log("Flushing because new bundle is full (#{@fileCount} sources)")
             flush
         end
             log("Flushing because new bundle is full (#{@fileCount} sources)")
             flush
         end
@@ -256,6 +265,16 @@ class BundleManager
     end
 end
 
     end
 end
 
+def BundlePrefixAndSizeForPath(path)
+    topLevelDirectory = TopLevelDirectoryForPath(path.dirname)
+    $denseBundleFilters.each { |filter|
+        if path.fnmatch(filter)
+            return filter, MAX_DENSE_BUNDLE_SIZE
+        end
+    }
+    return topLevelDirectory, MAX_BUNDLE_SIZE
+end
+
 def TopLevelDirectoryForPath(path)
     if !path
         return nil
 def TopLevelDirectoryForPath(path)
     if !path
         return nil
index 898baa7..8a9b206 100644 (file)
@@ -1,3 +1,40 @@
+2019-10-14  Tim Horton  <timothy_horton@apple.com>
+
+        Unify sources for bindings more densely
+        https://bugs.webkit.org/show_bug.cgi?id=202918
+
+        Reviewed by Simon Fraser.
+
+        No new tests, just a build time speedup.
+        For me, this is a reliable 17% boost on the WebCore Build Time Benchmark.
+
+        * Scripts/generate-unified-sources.sh:
+        Use dense bundles for JS* and bindings/js/*.
+        This seems acceptable for a few reasons:
+
+        - most of the time building these files is spent parsing the exact
+        same set of JSC headers, because the generated bindings code ends
+        up including the same set of things
+
+        - the incremental build cost of bundling more bindings sources together
+        is small, because the JSC headers dominate the time
+
+        - folks will frequently have to rebuild all of the bindings (on every
+        pull, for example, because they indirectly include most JSC headers),
+        but rarely end up rebuilding only a single one (in my experience)
+
+        * bindings/js/ReadableStreamDefaultController.cpp:
+        (WebCore::readableStreamCallFunction):
+        (WebCore::ReadableStreamDefaultController::invoke):
+        (WebCore::callFunction): Deleted.
+        Deduplicate static functions that now get bundled together.
+
+        * platform/graphics/ca/PlatformCALayer.cpp:
+        (WebCore::PlatformCALayer::currentTimeToMediaTime):
+        * platform/graphics/ca/PlatformCALayer.h:
+        In older macOS SDKs, CABase.h included ApplicationServices.h, which
+        causes lots of trouble.
+
 2019-10-14  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] White pages in AC mode: Cannot get default EGL display: EGL_BAD_PARAMETER
 2019-10-14  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] White pages in AC mode: Cannot get default EGL display: EGL_BAD_PARAMETER
index a83543c..b4ff3ea 100755 (executable)
@@ -21,4 +21,4 @@ if [ $# -eq 0 ]; then
     echo "Using unified source list files: Sources.txt, SourcesCocoa.txt"
 fi
 
     echo "Using unified source list files: Sources.txt, SourcesCocoa.txt"
 fi
 
-/usr/bin/env ruby "${BUILD_SCRIPTS_DIR}/generate-unified-source-bundles.rb" "--derived-sources-path" "${BUILT_PRODUCTS_DIR}/DerivedSources/WebCore" "--source-tree-path" "${SRCROOT}" "--feature-flags" "${FEATURE_DEFINES}" "--max-cpp-bundle-count" "${UnifiedSourceCppFileCount}" "--max-obj-c-bundle-count" "${UnifiedSourceMmFileCount}" "Sources.txt" "SourcesCocoa.txt" "${ARGS[@]}" > /dev/null
+/usr/bin/env ruby "${BUILD_SCRIPTS_DIR}/generate-unified-source-bundles.rb" "--derived-sources-path" "${BUILT_PRODUCTS_DIR}/DerivedSources/WebCore" "--source-tree-path" "${SRCROOT}" "--feature-flags" "${FEATURE_DEFINES}" "--max-cpp-bundle-count" "${UnifiedSourceCppFileCount}" "--max-obj-c-bundle-count" "${UnifiedSourceMmFileCount}" "--dense-bundle-filter" "JS*" "--dense-bundle-filter" "bindings/js/*" "Sources.txt" "SourcesCocoa.txt" "${ARGS[@]}" > /dev/null
index 05cdc39..cb53072 100644 (file)
@@ -41,7 +41,7 @@
 
 namespace WebCore {
 
 
 namespace WebCore {
 
-static inline JSC::JSValue callFunction(JSC::ExecState& state, JSC::JSValue jsFunction, JSC::JSValue thisValue, const JSC::ArgList& arguments)
+static inline JSC::JSValue readableStreamCallFunction(JSC::ExecState& state, JSC::JSValue jsFunction, JSC::JSValue thisValue, const JSC::ArgList& arguments)
 {
     JSC::CallData callData;
     auto callType = JSC::getCallData(state.vm(), jsFunction, callData);
 {
     JSC::CallData callData;
     auto callType = JSC::getCallData(state.vm(), jsFunction, callData);
@@ -67,7 +67,7 @@ JSC::JSValue ReadableStreamDefaultController::invoke(JSC::ExecState& state, JSC:
     arguments.append(parameter);
     ASSERT(!arguments.hasOverflowed());
 
     arguments.append(parameter);
     ASSERT(!arguments.hasOverflowed());
 
-    return callFunction(state, function, &object, arguments);
+    return readableStreamCallFunction(state, function, &object, arguments);
 }
 
 } // namespace WebCore
 }
 
 } // namespace WebCore
index 7a91900..2199527 100644 (file)
@@ -33,6 +33,7 @@
 #include "PlatformCALayerClient.h"
 #include <CoreFoundation/CoreFoundation.h>
 #include <CoreText/CoreText.h>
 #include "PlatformCALayerClient.h"
 #include <CoreFoundation/CoreFoundation.h>
 #include <CoreText/CoreText.h>
+#include <QuartzCore/CABase.h>
 #include <wtf/text/TextStream.h>
 
 #if PLATFORM(WIN)
 #include <wtf/text/TextStream.h>
 
 #if PLATFORM(WIN)
@@ -65,6 +66,11 @@ PlatformCALayer::~PlatformCALayer()
     setOwner(nullptr);
 }
 
     setOwner(nullptr);
 }
 
+CFTimeInterval PlatformCALayer::currentTimeToMediaTime(MonotonicTime t)
+{
+    return CACurrentMediaTime() + (t - MonotonicTime::now()).seconds();
+}
+
 bool PlatformCALayer::canHaveBackingStore() const
 {
     return m_layerType == LayerType::LayerTypeWebLayer
 bool PlatformCALayer::canHaveBackingStore() const
 {
     return m_layerType == LayerType::LayerTypeWebLayer
index f19768a..ebc100c 100644 (file)
@@ -27,7 +27,6 @@
 
 #include "FloatRoundedRect.h"
 #include "GraphicsLayer.h"
 
 #include "FloatRoundedRect.h"
 #include "GraphicsLayer.h"
-#include <QuartzCore/CABase.h>
 #include <wtf/RefCounted.h>
 #include <wtf/RetainPtr.h>
 #include <wtf/TypeCasts.h>
 #include <wtf/RefCounted.h>
 #include <wtf/RetainPtr.h>
 #include <wtf/TypeCasts.h>
@@ -55,7 +54,7 @@ class WEBCORE_EXPORT PlatformCALayer : public RefCounted<PlatformCALayer> {
     friend class PlatformCALayerWin;
 #endif
 public:
     friend class PlatformCALayerWin;
 #endif
 public:
-    static CFTimeInterval currentTimeToMediaTime(MonotonicTime t) { return CACurrentMediaTime() + (t - MonotonicTime::now()).seconds(); }
+    static CFTimeInterval currentTimeToMediaTime(MonotonicTime);
 
     // LayerTypeRootLayer is used on some platforms. It has no backing store, so setNeedsDisplay
     // should not call CACFLayerSetNeedsDisplay, but rather just notify the renderer that it
 
     // LayerTypeRootLayer is used on some platforms. It has no backing store, so setNeedsDisplay
     // should not call CACFLayerSetNeedsDisplay, but rather just notify the renderer that it