Vc cc improvements - #16

Open
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements
Open

Vc cc improvements#16
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements

Conversation

@bulk88

Copy link
Copy Markdown
Contributor

fix a syntax error with VC 6, make a "release" optimized VC 6 option, VC 2005 and newer warnings fixes, a slight perf improvement on VC 2005 and newer as compared to the previous situation, but VC 2003 and earlier builds will always be faster than a VC 2005 or newer build of dmake. The vast majority of stdio is not available in _nolock versions thanks to MS so only fputc got optimized to a nolock version, its still something.

unix/dcache:
- make extern.h be first for Win32 warnings disable
unix/runargv.c:
- extern.h includes signal.h, specifying signal.h before extern.h causes
the Win32 specific defines which disable warnings to be skipped, the
reason for signal.h before extern.h is before git history and is
therefore unknown
win95/switchar.c:
- all 3 includes are in extern.h
In MS and Mingw's headers, there is no define from fputc to _fputc_nolock.
This has to be done manually.
mingw 4.6.3 has _fputc_nolock in its headers so use it.
VC6 doesn't understand ULL suffix (only UI64), >= VC 2003 understand ULL,
to make things simple, just drop the suffix. This was a syntax error on
VC6.
Previously a VC6 build was built with -Od, this is inefficient, and not
needed since the vast majority of dmake users will never C debug it. make
mk.bat similar to mk70.bat. I dont think anyone wants the COFF and CV
symbol formats, they bloat dmake.exe by 10s of KBs. My VC 2003 C debugger
understood the VC 6 PDB without a problem but not the legacy symbol
formats.
64 bit seems to work, no fixes or anything special needs to be done, just
use the right vcvars*.bat file to select the right cl.exe
the Win32 implementation of readdir (FindNextFile) gives the mtime unlike
on unix, so no need to chdir, so a relative stat() call later works, since
no stat call is done. This saves 2 chdirs per directory enumerated and
cached and there are about 3-5 dirs for a Perl ExtUtils::MakeMaker build
and 5-8 dirs for Perl core build enumerated.On VC 2003, each chdir is
22us wall time with children according to my C profiler. On VC >= 2005
chdir is more expensive since a number of locks are acquired since MS
dropped the single threaded static libc. The vast majority of chdirs come
from finished_child, not CacheStat, for example, in parallel building
perl interp, for me 317 calls chdirs dropped to 302 after this patch.
In Def_recipe dont assign NULL to a calloc-ed struct and don't check for
rcp being NULL, as it was already checked for NULL in Add_recipe_to_list
which is the only caller of Def_recipe.
In Add_recipe_to_list, remove the NULL check, all callers of
Add_recipe_to_list will never pass a NULL, the callers are Parse and
Parse_rule_def.
In DmStrDup, don't compute strlen twice, once explicitly, the other time
inside strcpy. Anyways, memcpy is more deterministic to the CPU as to end
of the copying loop, than strcpy.
In Parse_macro, reduce the liveness of var cp, the newly created var sp
will replace var cp's C stack or non-vol reg slot instead of both sp and
cp being saved around the DmStrDup call.
Previously, if none of the chars are found, another loop (strlen())
through the string must be done. With strcspn, another loop isn't done,
just 1 add instruction.
see explanation in commit
"use strpbrk instead of textbook inefficient roll your own version"
@bulk88

Copy link
Copy Markdown
ContributorAuthor

added more comits, here is a before (at commit "eliminate chdir from CacheStat on Win32") and
after (at commit "DmStrSpn: use strspn instead of self rolling outselves"). Most notable, 3537077-3343092=193985 calls to strchr were removed because of the DmStrSpn change, but in the after DmStrSpn and strspn only executed, 186193 times, which means 193985-186193=7792 times the original self rolled rolled version called strchr more than once, and did more than 1 pass through the string. There is some time savings in DmStrPbrk, which went from 0.48 us to 0.46 us in "average with children", this is because of the strlen removal, although I have no data from the profiler on how often that old strlen branch executed in DmStrPbrk (strlen is an "intrinsic" and is inlined and is not profilable). DmStrSpn actually stayed the same time wise at 0.42 us. Note this profiler stops inlining of most of dmake's code. In a non-instrumented -O2 dmake DmStrPbrk and DmStrSpn are always inlined, since those null checks on its args are often optimized away by VC.
more strings b4
more strings after

Remove_file and the "!" operator are always inlined into the caller into
a test asm op then conditional jump on VC 2003 -O2.
fclose contains a fflush or equivelent call per posix/C. Calling fflush
after every line will mean <=80 byte writes to the disk/FS driver/kernel.
Calling fflush after every write of a line console is understandable, for
a disk it isn't. By removing/merging the fflush with fclose, in most cases
the entire temp file will be buffered in stdio in user mode and sent to the
kernel only when the file is closed. Move the error check to fclose. On
VS >= 2005, this also means that the MT lock will be aquired once for the
fclose, not once (or more) for fflush then again for fclose.
My test workload for dmake (a perl build) makes 3 temp files per
"dmake all". The number of fflush calls was reduced from 140 to 137 with
this patch. The number of WriteFile calls stayed the same at 145, probably
since the temp files are 1 line long. The majority of fflush calls are
writing to console in my workload.
I didn't realize dmstr2 existed when I created STRINGIFY and DM_StGiFy, so
remove my API names in favor dmake's older (and more authoritative) names.
commit "Stop tracking autoconf-generated files." discontinued distributing
configure
the winnt bat file builds are generally broken, but sychronize them to
avoid more rotting
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 72edc11 to 68d9de8CompareMarch 18, 2015 03:55
done with cygwin autoconf, no gcc installed, vcvars32.bat env vars set from
VC 6, macros that were undefed were not included in this commit, also
autoconf undefed HAVE_UTIME_NULL, so leave the former hand set
HAVE_UTIME_NULL on.
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 68d9de8 to f6abcc2CompareMarch 18, 2015 04:41
The error I (bulk88) saw was
checking the operating system... configure: error: MINGW32_NT-5.1 operating syst
em is not suitable to build dmake!
*returned to prompt*
In commit
"dont call fflush for each line written when generating a tmp file" I
stopped flushing the fd of a temp file after every line, but that
introduced a new bug, since Close_temp was not always closing a fd (IDK if
that is intentional or not) even though it looked like it did. Change
Close_temp to fflush the fd if it wasn't fclose-d. The bug presented itself
as a temp file being empty when GCC read it, but examining the temp showed
it was filled correctly because it was filled as dmake was exiting after
processing the GCC non-zero exit.
@mohawk2
mohawk2force-pushed the master branch 10 times, most recently from a5fd843 to 920ca5eCompareApril 13, 2019 01:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bulk88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Vc cc improvements - #16

Open
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements
Open

Vc cc improvements#16
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements

Conversation

@bulk88

Copy link
Copy Markdown
Contributor

fix a syntax error with VC 6, make a "release" optimized VC 6 option, VC 2005 and newer warnings fixes, a slight perf improvement on VC 2005 and newer as compared to the previous situation, but VC 2003 and earlier builds will always be faster than a VC 2005 or newer build of dmake. The vast majority of stdio is not available in _nolock versions thanks to MS so only fputc got optimized to a nolock version, its still something.

unix/dcache:
- make extern.h be first for Win32 warnings disable
unix/runargv.c:
- extern.h includes signal.h, specifying signal.h before extern.h causes
the Win32 specific defines which disable warnings to be skipped, the
reason for signal.h before extern.h is before git history and is
therefore unknown
win95/switchar.c:
- all 3 includes are in extern.h
In MS and Mingw's headers, there is no define from fputc to _fputc_nolock.
This has to be done manually.
mingw 4.6.3 has _fputc_nolock in its headers so use it.
VC6 doesn't understand ULL suffix (only UI64), >= VC 2003 understand ULL,
to make things simple, just drop the suffix. This was a syntax error on
VC6.
Previously a VC6 build was built with -Od, this is inefficient, and not
needed since the vast majority of dmake users will never C debug it. make
mk.bat similar to mk70.bat. I dont think anyone wants the COFF and CV
symbol formats, they bloat dmake.exe by 10s of KBs. My VC 2003 C debugger
understood the VC 6 PDB without a problem but not the legacy symbol
formats.
64 bit seems to work, no fixes or anything special needs to be done, just
use the right vcvars*.bat file to select the right cl.exe
the Win32 implementation of readdir (FindNextFile) gives the mtime unlike
on unix, so no need to chdir, so a relative stat() call later works, since
no stat call is done. This saves 2 chdirs per directory enumerated and
cached and there are about 3-5 dirs for a Perl ExtUtils::MakeMaker build
and 5-8 dirs for Perl core build enumerated.On VC 2003, each chdir is
22us wall time with children according to my C profiler. On VC >= 2005
chdir is more expensive since a number of locks are acquired since MS
dropped the single threaded static libc. The vast majority of chdirs come
from finished_child, not CacheStat, for example, in parallel building
perl interp, for me 317 calls chdirs dropped to 302 after this patch.
In Def_recipe dont assign NULL to a calloc-ed struct and don't check for
rcp being NULL, as it was already checked for NULL in Add_recipe_to_list
which is the only caller of Def_recipe.
In Add_recipe_to_list, remove the NULL check, all callers of
Add_recipe_to_list will never pass a NULL, the callers are Parse and
Parse_rule_def.
In DmStrDup, don't compute strlen twice, once explicitly, the other time
inside strcpy. Anyways, memcpy is more deterministic to the CPU as to end
of the copying loop, than strcpy.
In Parse_macro, reduce the liveness of var cp, the newly created var sp
will replace var cp's C stack or non-vol reg slot instead of both sp and
cp being saved around the DmStrDup call.
Previously, if none of the chars are found, another loop (strlen())
through the string must be done. With strcspn, another loop isn't done,
just 1 add instruction.
see explanation in commit
"use strpbrk instead of textbook inefficient roll your own version"
@bulk88

Copy link
Copy Markdown
ContributorAuthor

added more comits, here is a before (at commit "eliminate chdir from CacheStat on Win32") and
after (at commit "DmStrSpn: use strspn instead of self rolling outselves"). Most notable, 3537077-3343092=193985 calls to strchr were removed because of the DmStrSpn change, but in the after DmStrSpn and strspn only executed, 186193 times, which means 193985-186193=7792 times the original self rolled rolled version called strchr more than once, and did more than 1 pass through the string. There is some time savings in DmStrPbrk, which went from 0.48 us to 0.46 us in "average with children", this is because of the strlen removal, although I have no data from the profiler on how often that old strlen branch executed in DmStrPbrk (strlen is an "intrinsic" and is inlined and is not profilable). DmStrSpn actually stayed the same time wise at 0.42 us. Note this profiler stops inlining of most of dmake's code. In a non-instrumented -O2 dmake DmStrPbrk and DmStrSpn are always inlined, since those null checks on its args are often optimized away by VC.
more strings b4
more strings after

Remove_file and the "!" operator are always inlined into the caller into
a test asm op then conditional jump on VC 2003 -O2.
fclose contains a fflush or equivelent call per posix/C. Calling fflush
after every line will mean <=80 byte writes to the disk/FS driver/kernel.
Calling fflush after every write of a line console is understandable, for
a disk it isn't. By removing/merging the fflush with fclose, in most cases
the entire temp file will be buffered in stdio in user mode and sent to the
kernel only when the file is closed. Move the error check to fclose. On
VS >= 2005, this also means that the MT lock will be aquired once for the
fclose, not once (or more) for fflush then again for fclose.
My test workload for dmake (a perl build) makes 3 temp files per
"dmake all". The number of fflush calls was reduced from 140 to 137 with
this patch. The number of WriteFile calls stayed the same at 145, probably
since the temp files are 1 line long. The majority of fflush calls are
writing to console in my workload.
I didn't realize dmstr2 existed when I created STRINGIFY and DM_StGiFy, so
remove my API names in favor dmake's older (and more authoritative) names.
commit "Stop tracking autoconf-generated files." discontinued distributing
configure
the winnt bat file builds are generally broken, but sychronize them to
avoid more rotting
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 72edc11 to 68d9de8CompareMarch 18, 2015 03:55
done with cygwin autoconf, no gcc installed, vcvars32.bat env vars set from
VC 6, macros that were undefed were not included in this commit, also
autoconf undefed HAVE_UTIME_NULL, so leave the former hand set
HAVE_UTIME_NULL on.
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 68d9de8 to f6abcc2CompareMarch 18, 2015 04:41
The error I (bulk88) saw was
checking the operating system... configure: error: MINGW32_NT-5.1 operating syst
em is not suitable to build dmake!
*returned to prompt*
In commit
"dont call fflush for each line written when generating a tmp file" I
stopped flushing the fd of a temp file after every line, but that
introduced a new bug, since Close_temp was not always closing a fd (IDK if
that is intentional or not) even though it looked like it did. Change
Close_temp to fflush the fd if it wasn't fclose-d. The bug presented itself
as a temp file being empty when GCC read it, but examining the temp showed
it was filled correctly because it was filled as dmake was exiting after
processing the GCC non-zero exit.
@mohawk2
mohawk2force-pushed the master branch 10 times, most recently from a5fd843 to 920ca5eCompareApril 13, 2019 01:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bulk88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Vc cc improvements - #16

Open
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements
Open

Vc cc improvements#16
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements

Conversation

@bulk88

Copy link
Copy Markdown
Contributor

fix a syntax error with VC 6, make a "release" optimized VC 6 option, VC 2005 and newer warnings fixes, a slight perf improvement on VC 2005 and newer as compared to the previous situation, but VC 2003 and earlier builds will always be faster than a VC 2005 or newer build of dmake. The vast majority of stdio is not available in _nolock versions thanks to MS so only fputc got optimized to a nolock version, its still something.

unix/dcache:
- make extern.h be first for Win32 warnings disable
unix/runargv.c:
- extern.h includes signal.h, specifying signal.h before extern.h causes
the Win32 specific defines which disable warnings to be skipped, the
reason for signal.h before extern.h is before git history and is
therefore unknown
win95/switchar.c:
- all 3 includes are in extern.h
In MS and Mingw's headers, there is no define from fputc to _fputc_nolock.
This has to be done manually.
mingw 4.6.3 has _fputc_nolock in its headers so use it.
VC6 doesn't understand ULL suffix (only UI64), >= VC 2003 understand ULL,
to make things simple, just drop the suffix. This was a syntax error on
VC6.
Previously a VC6 build was built with -Od, this is inefficient, and not
needed since the vast majority of dmake users will never C debug it. make
mk.bat similar to mk70.bat. I dont think anyone wants the COFF and CV
symbol formats, they bloat dmake.exe by 10s of KBs. My VC 2003 C debugger
understood the VC 6 PDB without a problem but not the legacy symbol
formats.
64 bit seems to work, no fixes or anything special needs to be done, just
use the right vcvars*.bat file to select the right cl.exe
the Win32 implementation of readdir (FindNextFile) gives the mtime unlike
on unix, so no need to chdir, so a relative stat() call later works, since
no stat call is done. This saves 2 chdirs per directory enumerated and
cached and there are about 3-5 dirs for a Perl ExtUtils::MakeMaker build
and 5-8 dirs for Perl core build enumerated.On VC 2003, each chdir is
22us wall time with children according to my C profiler. On VC >= 2005
chdir is more expensive since a number of locks are acquired since MS
dropped the single threaded static libc. The vast majority of chdirs come
from finished_child, not CacheStat, for example, in parallel building
perl interp, for me 317 calls chdirs dropped to 302 after this patch.
In Def_recipe dont assign NULL to a calloc-ed struct and don't check for
rcp being NULL, as it was already checked for NULL in Add_recipe_to_list
which is the only caller of Def_recipe.
In Add_recipe_to_list, remove the NULL check, all callers of
Add_recipe_to_list will never pass a NULL, the callers are Parse and
Parse_rule_def.
In DmStrDup, don't compute strlen twice, once explicitly, the other time
inside strcpy. Anyways, memcpy is more deterministic to the CPU as to end
of the copying loop, than strcpy.
In Parse_macro, reduce the liveness of var cp, the newly created var sp
will replace var cp's C stack or non-vol reg slot instead of both sp and
cp being saved around the DmStrDup call.
Previously, if none of the chars are found, another loop (strlen())
through the string must be done. With strcspn, another loop isn't done,
just 1 add instruction.
see explanation in commit
"use strpbrk instead of textbook inefficient roll your own version"
@bulk88

Copy link
Copy Markdown
ContributorAuthor

added more comits, here is a before (at commit "eliminate chdir from CacheStat on Win32") and
after (at commit "DmStrSpn: use strspn instead of self rolling outselves"). Most notable, 3537077-3343092=193985 calls to strchr were removed because of the DmStrSpn change, but in the after DmStrSpn and strspn only executed, 186193 times, which means 193985-186193=7792 times the original self rolled rolled version called strchr more than once, and did more than 1 pass through the string. There is some time savings in DmStrPbrk, which went from 0.48 us to 0.46 us in "average with children", this is because of the strlen removal, although I have no data from the profiler on how often that old strlen branch executed in DmStrPbrk (strlen is an "intrinsic" and is inlined and is not profilable). DmStrSpn actually stayed the same time wise at 0.42 us. Note this profiler stops inlining of most of dmake's code. In a non-instrumented -O2 dmake DmStrPbrk and DmStrSpn are always inlined, since those null checks on its args are often optimized away by VC.
more strings b4
more strings after

Remove_file and the "!" operator are always inlined into the caller into
a test asm op then conditional jump on VC 2003 -O2.
fclose contains a fflush or equivelent call per posix/C. Calling fflush
after every line will mean <=80 byte writes to the disk/FS driver/kernel.
Calling fflush after every write of a line console is understandable, for
a disk it isn't. By removing/merging the fflush with fclose, in most cases
the entire temp file will be buffered in stdio in user mode and sent to the
kernel only when the file is closed. Move the error check to fclose. On
VS >= 2005, this also means that the MT lock will be aquired once for the
fclose, not once (or more) for fflush then again for fclose.
My test workload for dmake (a perl build) makes 3 temp files per
"dmake all". The number of fflush calls was reduced from 140 to 137 with
this patch. The number of WriteFile calls stayed the same at 145, probably
since the temp files are 1 line long. The majority of fflush calls are
writing to console in my workload.
I didn't realize dmstr2 existed when I created STRINGIFY and DM_StGiFy, so
remove my API names in favor dmake's older (and more authoritative) names.
commit "Stop tracking autoconf-generated files." discontinued distributing
configure
the winnt bat file builds are generally broken, but sychronize them to
avoid more rotting
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 72edc11 to 68d9de8CompareMarch 18, 2015 03:55
done with cygwin autoconf, no gcc installed, vcvars32.bat env vars set from
VC 6, macros that were undefed were not included in this commit, also
autoconf undefed HAVE_UTIME_NULL, so leave the former hand set
HAVE_UTIME_NULL on.
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 68d9de8 to f6abcc2CompareMarch 18, 2015 04:41
The error I (bulk88) saw was
checking the operating system... configure: error: MINGW32_NT-5.1 operating syst
em is not suitable to build dmake!
*returned to prompt*
In commit
"dont call fflush for each line written when generating a tmp file" I
stopped flushing the fd of a temp file after every line, but that
introduced a new bug, since Close_temp was not always closing a fd (IDK if
that is intentional or not) even though it looked like it did. Change
Close_temp to fflush the fd if it wasn't fclose-d. The bug presented itself
as a temp file being empty when GCC read it, but examining the temp showed
it was filled correctly because it was filled as dmake was exiting after
processing the GCC non-zero exit.
@mohawk2
mohawk2force-pushed the master branch 10 times, most recently from a5fd843 to 920ca5eCompareApril 13, 2019 01:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bulk88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Vc cc improvements - #16

Open
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements
Open

Vc cc improvements#16
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements

Conversation

@bulk88

Copy link
Copy Markdown
Contributor

fix a syntax error with VC 6, make a "release" optimized VC 6 option, VC 2005 and newer warnings fixes, a slight perf improvement on VC 2005 and newer as compared to the previous situation, but VC 2003 and earlier builds will always be faster than a VC 2005 or newer build of dmake. The vast majority of stdio is not available in _nolock versions thanks to MS so only fputc got optimized to a nolock version, its still something.

unix/dcache:
- make extern.h be first for Win32 warnings disable
unix/runargv.c:
- extern.h includes signal.h, specifying signal.h before extern.h causes
the Win32 specific defines which disable warnings to be skipped, the
reason for signal.h before extern.h is before git history and is
therefore unknown
win95/switchar.c:
- all 3 includes are in extern.h
In MS and Mingw's headers, there is no define from fputc to _fputc_nolock.
This has to be done manually.
mingw 4.6.3 has _fputc_nolock in its headers so use it.
VC6 doesn't understand ULL suffix (only UI64), >= VC 2003 understand ULL,
to make things simple, just drop the suffix. This was a syntax error on
VC6.
Previously a VC6 build was built with -Od, this is inefficient, and not
needed since the vast majority of dmake users will never C debug it. make
mk.bat similar to mk70.bat. I dont think anyone wants the COFF and CV
symbol formats, they bloat dmake.exe by 10s of KBs. My VC 2003 C debugger
understood the VC 6 PDB without a problem but not the legacy symbol
formats.
64 bit seems to work, no fixes or anything special needs to be done, just
use the right vcvars*.bat file to select the right cl.exe
the Win32 implementation of readdir (FindNextFile) gives the mtime unlike
on unix, so no need to chdir, so a relative stat() call later works, since
no stat call is done. This saves 2 chdirs per directory enumerated and
cached and there are about 3-5 dirs for a Perl ExtUtils::MakeMaker build
and 5-8 dirs for Perl core build enumerated.On VC 2003, each chdir is
22us wall time with children according to my C profiler. On VC >= 2005
chdir is more expensive since a number of locks are acquired since MS
dropped the single threaded static libc. The vast majority of chdirs come
from finished_child, not CacheStat, for example, in parallel building
perl interp, for me 317 calls chdirs dropped to 302 after this patch.
In Def_recipe dont assign NULL to a calloc-ed struct and don't check for
rcp being NULL, as it was already checked for NULL in Add_recipe_to_list
which is the only caller of Def_recipe.
In Add_recipe_to_list, remove the NULL check, all callers of
Add_recipe_to_list will never pass a NULL, the callers are Parse and
Parse_rule_def.
In DmStrDup, don't compute strlen twice, once explicitly, the other time
inside strcpy. Anyways, memcpy is more deterministic to the CPU as to end
of the copying loop, than strcpy.
In Parse_macro, reduce the liveness of var cp, the newly created var sp
will replace var cp's C stack or non-vol reg slot instead of both sp and
cp being saved around the DmStrDup call.
Previously, if none of the chars are found, another loop (strlen())
through the string must be done. With strcspn, another loop isn't done,
just 1 add instruction.
see explanation in commit
"use strpbrk instead of textbook inefficient roll your own version"
@bulk88

Copy link
Copy Markdown
ContributorAuthor

added more comits, here is a before (at commit "eliminate chdir from CacheStat on Win32") and
after (at commit "DmStrSpn: use strspn instead of self rolling outselves"). Most notable, 3537077-3343092=193985 calls to strchr were removed because of the DmStrSpn change, but in the after DmStrSpn and strspn only executed, 186193 times, which means 193985-186193=7792 times the original self rolled rolled version called strchr more than once, and did more than 1 pass through the string. There is some time savings in DmStrPbrk, which went from 0.48 us to 0.46 us in "average with children", this is because of the strlen removal, although I have no data from the profiler on how often that old strlen branch executed in DmStrPbrk (strlen is an "intrinsic" and is inlined and is not profilable). DmStrSpn actually stayed the same time wise at 0.42 us. Note this profiler stops inlining of most of dmake's code. In a non-instrumented -O2 dmake DmStrPbrk and DmStrSpn are always inlined, since those null checks on its args are often optimized away by VC.
more strings b4
more strings after

Remove_file and the "!" operator are always inlined into the caller into
a test asm op then conditional jump on VC 2003 -O2.
fclose contains a fflush or equivelent call per posix/C. Calling fflush
after every line will mean <=80 byte writes to the disk/FS driver/kernel.
Calling fflush after every write of a line console is understandable, for
a disk it isn't. By removing/merging the fflush with fclose, in most cases
the entire temp file will be buffered in stdio in user mode and sent to the
kernel only when the file is closed. Move the error check to fclose. On
VS >= 2005, this also means that the MT lock will be aquired once for the
fclose, not once (or more) for fflush then again for fclose.
My test workload for dmake (a perl build) makes 3 temp files per
"dmake all". The number of fflush calls was reduced from 140 to 137 with
this patch. The number of WriteFile calls stayed the same at 145, probably
since the temp files are 1 line long. The majority of fflush calls are
writing to console in my workload.
I didn't realize dmstr2 existed when I created STRINGIFY and DM_StGiFy, so
remove my API names in favor dmake's older (and more authoritative) names.
commit "Stop tracking autoconf-generated files." discontinued distributing
configure
the winnt bat file builds are generally broken, but sychronize them to
avoid more rotting
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 72edc11 to 68d9de8CompareMarch 18, 2015 03:55
done with cygwin autoconf, no gcc installed, vcvars32.bat env vars set from
VC 6, macros that were undefed were not included in this commit, also
autoconf undefed HAVE_UTIME_NULL, so leave the former hand set
HAVE_UTIME_NULL on.
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 68d9de8 to f6abcc2CompareMarch 18, 2015 04:41
The error I (bulk88) saw was
checking the operating system... configure: error: MINGW32_NT-5.1 operating syst
em is not suitable to build dmake!
*returned to prompt*
In commit
"dont call fflush for each line written when generating a tmp file" I
stopped flushing the fd of a temp file after every line, but that
introduced a new bug, since Close_temp was not always closing a fd (IDK if
that is intentional or not) even though it looked like it did. Change
Close_temp to fflush the fd if it wasn't fclose-d. The bug presented itself
as a temp file being empty when GCC read it, but examining the temp showed
it was filled correctly because it was filled as dmake was exiting after
processing the GCC non-zero exit.
@mohawk2
mohawk2force-pushed the master branch 10 times, most recently from a5fd843 to 920ca5eCompareApril 13, 2019 01:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bulk88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Vc cc improvements - #16

Open
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements
Open

Vc cc improvements#16
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements

Conversation

@bulk88

Copy link
Copy Markdown
Contributor

fix a syntax error with VC 6, make a "release" optimized VC 6 option, VC 2005 and newer warnings fixes, a slight perf improvement on VC 2005 and newer as compared to the previous situation, but VC 2003 and earlier builds will always be faster than a VC 2005 or newer build of dmake. The vast majority of stdio is not available in _nolock versions thanks to MS so only fputc got optimized to a nolock version, its still something.

unix/dcache:
- make extern.h be first for Win32 warnings disable
unix/runargv.c:
- extern.h includes signal.h, specifying signal.h before extern.h causes
the Win32 specific defines which disable warnings to be skipped, the
reason for signal.h before extern.h is before git history and is
therefore unknown
win95/switchar.c:
- all 3 includes are in extern.h
In MS and Mingw's headers, there is no define from fputc to _fputc_nolock.
This has to be done manually.
mingw 4.6.3 has _fputc_nolock in its headers so use it.
VC6 doesn't understand ULL suffix (only UI64), >= VC 2003 understand ULL,
to make things simple, just drop the suffix. This was a syntax error on
VC6.
Previously a VC6 build was built with -Od, this is inefficient, and not
needed since the vast majority of dmake users will never C debug it. make
mk.bat similar to mk70.bat. I dont think anyone wants the COFF and CV
symbol formats, they bloat dmake.exe by 10s of KBs. My VC 2003 C debugger
understood the VC 6 PDB without a problem but not the legacy symbol
formats.
64 bit seems to work, no fixes or anything special needs to be done, just
use the right vcvars*.bat file to select the right cl.exe
the Win32 implementation of readdir (FindNextFile) gives the mtime unlike
on unix, so no need to chdir, so a relative stat() call later works, since
no stat call is done. This saves 2 chdirs per directory enumerated and
cached and there are about 3-5 dirs for a Perl ExtUtils::MakeMaker build
and 5-8 dirs for Perl core build enumerated.On VC 2003, each chdir is
22us wall time with children according to my C profiler. On VC >= 2005
chdir is more expensive since a number of locks are acquired since MS
dropped the single threaded static libc. The vast majority of chdirs come
from finished_child, not CacheStat, for example, in parallel building
perl interp, for me 317 calls chdirs dropped to 302 after this patch.
In Def_recipe dont assign NULL to a calloc-ed struct and don't check for
rcp being NULL, as it was already checked for NULL in Add_recipe_to_list
which is the only caller of Def_recipe.
In Add_recipe_to_list, remove the NULL check, all callers of
Add_recipe_to_list will never pass a NULL, the callers are Parse and
Parse_rule_def.
In DmStrDup, don't compute strlen twice, once explicitly, the other time
inside strcpy. Anyways, memcpy is more deterministic to the CPU as to end
of the copying loop, than strcpy.
In Parse_macro, reduce the liveness of var cp, the newly created var sp
will replace var cp's C stack or non-vol reg slot instead of both sp and
cp being saved around the DmStrDup call.
Previously, if none of the chars are found, another loop (strlen())
through the string must be done. With strcspn, another loop isn't done,
just 1 add instruction.
see explanation in commit
"use strpbrk instead of textbook inefficient roll your own version"
@bulk88

Copy link
Copy Markdown
ContributorAuthor

added more comits, here is a before (at commit "eliminate chdir from CacheStat on Win32") and
after (at commit "DmStrSpn: use strspn instead of self rolling outselves"). Most notable, 3537077-3343092=193985 calls to strchr were removed because of the DmStrSpn change, but in the after DmStrSpn and strspn only executed, 186193 times, which means 193985-186193=7792 times the original self rolled rolled version called strchr more than once, and did more than 1 pass through the string. There is some time savings in DmStrPbrk, which went from 0.48 us to 0.46 us in "average with children", this is because of the strlen removal, although I have no data from the profiler on how often that old strlen branch executed in DmStrPbrk (strlen is an "intrinsic" and is inlined and is not profilable). DmStrSpn actually stayed the same time wise at 0.42 us. Note this profiler stops inlining of most of dmake's code. In a non-instrumented -O2 dmake DmStrPbrk and DmStrSpn are always inlined, since those null checks on its args are often optimized away by VC.
more strings b4
more strings after

Remove_file and the "!" operator are always inlined into the caller into
a test asm op then conditional jump on VC 2003 -O2.
fclose contains a fflush or equivelent call per posix/C. Calling fflush
after every line will mean <=80 byte writes to the disk/FS driver/kernel.
Calling fflush after every write of a line console is understandable, for
a disk it isn't. By removing/merging the fflush with fclose, in most cases
the entire temp file will be buffered in stdio in user mode and sent to the
kernel only when the file is closed. Move the error check to fclose. On
VS >= 2005, this also means that the MT lock will be aquired once for the
fclose, not once (or more) for fflush then again for fclose.
My test workload for dmake (a perl build) makes 3 temp files per
"dmake all". The number of fflush calls was reduced from 140 to 137 with
this patch. The number of WriteFile calls stayed the same at 145, probably
since the temp files are 1 line long. The majority of fflush calls are
writing to console in my workload.
I didn't realize dmstr2 existed when I created STRINGIFY and DM_StGiFy, so
remove my API names in favor dmake's older (and more authoritative) names.
commit "Stop tracking autoconf-generated files." discontinued distributing
configure
the winnt bat file builds are generally broken, but sychronize them to
avoid more rotting
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 72edc11 to 68d9de8CompareMarch 18, 2015 03:55
done with cygwin autoconf, no gcc installed, vcvars32.bat env vars set from
VC 6, macros that were undefed were not included in this commit, also
autoconf undefed HAVE_UTIME_NULL, so leave the former hand set
HAVE_UTIME_NULL on.
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 68d9de8 to f6abcc2CompareMarch 18, 2015 04:41
The error I (bulk88) saw was
checking the operating system... configure: error: MINGW32_NT-5.1 operating syst
em is not suitable to build dmake!
*returned to prompt*
In commit
"dont call fflush for each line written when generating a tmp file" I
stopped flushing the fd of a temp file after every line, but that
introduced a new bug, since Close_temp was not always closing a fd (IDK if
that is intentional or not) even though it looked like it did. Change
Close_temp to fflush the fd if it wasn't fclose-d. The bug presented itself
as a temp file being empty when GCC read it, but examining the temp showed
it was filled correctly because it was filled as dmake was exiting after
processing the GCC non-zero exit.
@mohawk2
mohawk2force-pushed the master branch 10 times, most recently from a5fd843 to 920ca5eCompareApril 13, 2019 01:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bulk88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Vc cc improvements - #16

Open
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements
Open

Vc cc improvements#16
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements

Conversation

@bulk88

Copy link
Copy Markdown
Contributor

fix a syntax error with VC 6, make a "release" optimized VC 6 option, VC 2005 and newer warnings fixes, a slight perf improvement on VC 2005 and newer as compared to the previous situation, but VC 2003 and earlier builds will always be faster than a VC 2005 or newer build of dmake. The vast majority of stdio is not available in _nolock versions thanks to MS so only fputc got optimized to a nolock version, its still something.

unix/dcache:
- make extern.h be first for Win32 warnings disable
unix/runargv.c:
- extern.h includes signal.h, specifying signal.h before extern.h causes
the Win32 specific defines which disable warnings to be skipped, the
reason for signal.h before extern.h is before git history and is
therefore unknown
win95/switchar.c:
- all 3 includes are in extern.h
In MS and Mingw's headers, there is no define from fputc to _fputc_nolock.
This has to be done manually.
mingw 4.6.3 has _fputc_nolock in its headers so use it.
VC6 doesn't understand ULL suffix (only UI64), >= VC 2003 understand ULL,
to make things simple, just drop the suffix. This was a syntax error on
VC6.
Previously a VC6 build was built with -Od, this is inefficient, and not
needed since the vast majority of dmake users will never C debug it. make
mk.bat similar to mk70.bat. I dont think anyone wants the COFF and CV
symbol formats, they bloat dmake.exe by 10s of KBs. My VC 2003 C debugger
understood the VC 6 PDB without a problem but not the legacy symbol
formats.
64 bit seems to work, no fixes or anything special needs to be done, just
use the right vcvars*.bat file to select the right cl.exe
the Win32 implementation of readdir (FindNextFile) gives the mtime unlike
on unix, so no need to chdir, so a relative stat() call later works, since
no stat call is done. This saves 2 chdirs per directory enumerated and
cached and there are about 3-5 dirs for a Perl ExtUtils::MakeMaker build
and 5-8 dirs for Perl core build enumerated.On VC 2003, each chdir is
22us wall time with children according to my C profiler. On VC >= 2005
chdir is more expensive since a number of locks are acquired since MS
dropped the single threaded static libc. The vast majority of chdirs come
from finished_child, not CacheStat, for example, in parallel building
perl interp, for me 317 calls chdirs dropped to 302 after this patch.
In Def_recipe dont assign NULL to a calloc-ed struct and don't check for
rcp being NULL, as it was already checked for NULL in Add_recipe_to_list
which is the only caller of Def_recipe.
In Add_recipe_to_list, remove the NULL check, all callers of
Add_recipe_to_list will never pass a NULL, the callers are Parse and
Parse_rule_def.
In DmStrDup, don't compute strlen twice, once explicitly, the other time
inside strcpy. Anyways, memcpy is more deterministic to the CPU as to end
of the copying loop, than strcpy.
In Parse_macro, reduce the liveness of var cp, the newly created var sp
will replace var cp's C stack or non-vol reg slot instead of both sp and
cp being saved around the DmStrDup call.
Previously, if none of the chars are found, another loop (strlen())
through the string must be done. With strcspn, another loop isn't done,
just 1 add instruction.
see explanation in commit
"use strpbrk instead of textbook inefficient roll your own version"
@bulk88

Copy link
Copy Markdown
ContributorAuthor

added more comits, here is a before (at commit "eliminate chdir from CacheStat on Win32") and
after (at commit "DmStrSpn: use strspn instead of self rolling outselves"). Most notable, 3537077-3343092=193985 calls to strchr were removed because of the DmStrSpn change, but in the after DmStrSpn and strspn only executed, 186193 times, which means 193985-186193=7792 times the original self rolled rolled version called strchr more than once, and did more than 1 pass through the string. There is some time savings in DmStrPbrk, which went from 0.48 us to 0.46 us in "average with children", this is because of the strlen removal, although I have no data from the profiler on how often that old strlen branch executed in DmStrPbrk (strlen is an "intrinsic" and is inlined and is not profilable). DmStrSpn actually stayed the same time wise at 0.42 us. Note this profiler stops inlining of most of dmake's code. In a non-instrumented -O2 dmake DmStrPbrk and DmStrSpn are always inlined, since those null checks on its args are often optimized away by VC.
more strings b4
more strings after

Remove_file and the "!" operator are always inlined into the caller into
a test asm op then conditional jump on VC 2003 -O2.
fclose contains a fflush or equivelent call per posix/C. Calling fflush
after every line will mean <=80 byte writes to the disk/FS driver/kernel.
Calling fflush after every write of a line console is understandable, for
a disk it isn't. By removing/merging the fflush with fclose, in most cases
the entire temp file will be buffered in stdio in user mode and sent to the
kernel only when the file is closed. Move the error check to fclose. On
VS >= 2005, this also means that the MT lock will be aquired once for the
fclose, not once (or more) for fflush then again for fclose.
My test workload for dmake (a perl build) makes 3 temp files per
"dmake all". The number of fflush calls was reduced from 140 to 137 with
this patch. The number of WriteFile calls stayed the same at 145, probably
since the temp files are 1 line long. The majority of fflush calls are
writing to console in my workload.
I didn't realize dmstr2 existed when I created STRINGIFY and DM_StGiFy, so
remove my API names in favor dmake's older (and more authoritative) names.
commit "Stop tracking autoconf-generated files." discontinued distributing
configure
the winnt bat file builds are generally broken, but sychronize them to
avoid more rotting
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 72edc11 to 68d9de8CompareMarch 18, 2015 03:55
done with cygwin autoconf, no gcc installed, vcvars32.bat env vars set from
VC 6, macros that were undefed were not included in this commit, also
autoconf undefed HAVE_UTIME_NULL, so leave the former hand set
HAVE_UTIME_NULL on.
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 68d9de8 to f6abcc2CompareMarch 18, 2015 04:41
The error I (bulk88) saw was
checking the operating system... configure: error: MINGW32_NT-5.1 operating syst
em is not suitable to build dmake!
*returned to prompt*
In commit
"dont call fflush for each line written when generating a tmp file" I
stopped flushing the fd of a temp file after every line, but that
introduced a new bug, since Close_temp was not always closing a fd (IDK if
that is intentional or not) even though it looked like it did. Change
Close_temp to fflush the fd if it wasn't fclose-d. The bug presented itself
as a temp file being empty when GCC read it, but examining the temp showed
it was filled correctly because it was filled as dmake was exiting after
processing the GCC non-zero exit.
@mohawk2
mohawk2force-pushed the master branch 10 times, most recently from a5fd843 to 920ca5eCompareApril 13, 2019 01:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bulk88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Vc cc improvements - #16

Open
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements
Open

Vc cc improvements#16
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements

Conversation

@bulk88

Copy link
Copy Markdown
Contributor

fix a syntax error with VC 6, make a "release" optimized VC 6 option, VC 2005 and newer warnings fixes, a slight perf improvement on VC 2005 and newer as compared to the previous situation, but VC 2003 and earlier builds will always be faster than a VC 2005 or newer build of dmake. The vast majority of stdio is not available in _nolock versions thanks to MS so only fputc got optimized to a nolock version, its still something.

unix/dcache:
- make extern.h be first for Win32 warnings disable
unix/runargv.c:
- extern.h includes signal.h, specifying signal.h before extern.h causes
the Win32 specific defines which disable warnings to be skipped, the
reason for signal.h before extern.h is before git history and is
therefore unknown
win95/switchar.c:
- all 3 includes are in extern.h
In MS and Mingw's headers, there is no define from fputc to _fputc_nolock.
This has to be done manually.
mingw 4.6.3 has _fputc_nolock in its headers so use it.
VC6 doesn't understand ULL suffix (only UI64), >= VC 2003 understand ULL,
to make things simple, just drop the suffix. This was a syntax error on
VC6.
Previously a VC6 build was built with -Od, this is inefficient, and not
needed since the vast majority of dmake users will never C debug it. make
mk.bat similar to mk70.bat. I dont think anyone wants the COFF and CV
symbol formats, they bloat dmake.exe by 10s of KBs. My VC 2003 C debugger
understood the VC 6 PDB without a problem but not the legacy symbol
formats.
64 bit seems to work, no fixes or anything special needs to be done, just
use the right vcvars*.bat file to select the right cl.exe
the Win32 implementation of readdir (FindNextFile) gives the mtime unlike
on unix, so no need to chdir, so a relative stat() call later works, since
no stat call is done. This saves 2 chdirs per directory enumerated and
cached and there are about 3-5 dirs for a Perl ExtUtils::MakeMaker build
and 5-8 dirs for Perl core build enumerated.On VC 2003, each chdir is
22us wall time with children according to my C profiler. On VC >= 2005
chdir is more expensive since a number of locks are acquired since MS
dropped the single threaded static libc. The vast majority of chdirs come
from finished_child, not CacheStat, for example, in parallel building
perl interp, for me 317 calls chdirs dropped to 302 after this patch.
In Def_recipe dont assign NULL to a calloc-ed struct and don't check for
rcp being NULL, as it was already checked for NULL in Add_recipe_to_list
which is the only caller of Def_recipe.
In Add_recipe_to_list, remove the NULL check, all callers of
Add_recipe_to_list will never pass a NULL, the callers are Parse and
Parse_rule_def.
In DmStrDup, don't compute strlen twice, once explicitly, the other time
inside strcpy. Anyways, memcpy is more deterministic to the CPU as to end
of the copying loop, than strcpy.
In Parse_macro, reduce the liveness of var cp, the newly created var sp
will replace var cp's C stack or non-vol reg slot instead of both sp and
cp being saved around the DmStrDup call.
Previously, if none of the chars are found, another loop (strlen())
through the string must be done. With strcspn, another loop isn't done,
just 1 add instruction.
see explanation in commit
"use strpbrk instead of textbook inefficient roll your own version"
@bulk88

Copy link
Copy Markdown
ContributorAuthor

added more comits, here is a before (at commit "eliminate chdir from CacheStat on Win32") and
after (at commit "DmStrSpn: use strspn instead of self rolling outselves"). Most notable, 3537077-3343092=193985 calls to strchr were removed because of the DmStrSpn change, but in the after DmStrSpn and strspn only executed, 186193 times, which means 193985-186193=7792 times the original self rolled rolled version called strchr more than once, and did more than 1 pass through the string. There is some time savings in DmStrPbrk, which went from 0.48 us to 0.46 us in "average with children", this is because of the strlen removal, although I have no data from the profiler on how often that old strlen branch executed in DmStrPbrk (strlen is an "intrinsic" and is inlined and is not profilable). DmStrSpn actually stayed the same time wise at 0.42 us. Note this profiler stops inlining of most of dmake's code. In a non-instrumented -O2 dmake DmStrPbrk and DmStrSpn are always inlined, since those null checks on its args are often optimized away by VC.
more strings b4
more strings after

Remove_file and the "!" operator are always inlined into the caller into
a test asm op then conditional jump on VC 2003 -O2.
fclose contains a fflush or equivelent call per posix/C. Calling fflush
after every line will mean <=80 byte writes to the disk/FS driver/kernel.
Calling fflush after every write of a line console is understandable, for
a disk it isn't. By removing/merging the fflush with fclose, in most cases
the entire temp file will be buffered in stdio in user mode and sent to the
kernel only when the file is closed. Move the error check to fclose. On
VS >= 2005, this also means that the MT lock will be aquired once for the
fclose, not once (or more) for fflush then again for fclose.
My test workload for dmake (a perl build) makes 3 temp files per
"dmake all". The number of fflush calls was reduced from 140 to 137 with
this patch. The number of WriteFile calls stayed the same at 145, probably
since the temp files are 1 line long. The majority of fflush calls are
writing to console in my workload.
I didn't realize dmstr2 existed when I created STRINGIFY and DM_StGiFy, so
remove my API names in favor dmake's older (and more authoritative) names.
commit "Stop tracking autoconf-generated files." discontinued distributing
configure
the winnt bat file builds are generally broken, but sychronize them to
avoid more rotting
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 72edc11 to 68d9de8CompareMarch 18, 2015 03:55
done with cygwin autoconf, no gcc installed, vcvars32.bat env vars set from
VC 6, macros that were undefed were not included in this commit, also
autoconf undefed HAVE_UTIME_NULL, so leave the former hand set
HAVE_UTIME_NULL on.
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 68d9de8 to f6abcc2CompareMarch 18, 2015 04:41
The error I (bulk88) saw was
checking the operating system... configure: error: MINGW32_NT-5.1 operating syst
em is not suitable to build dmake!
*returned to prompt*
In commit
"dont call fflush for each line written when generating a tmp file" I
stopped flushing the fd of a temp file after every line, but that
introduced a new bug, since Close_temp was not always closing a fd (IDK if
that is intentional or not) even though it looked like it did. Change
Close_temp to fflush the fd if it wasn't fclose-d. The bug presented itself
as a temp file being empty when GCC read it, but examining the temp showed
it was filled correctly because it was filled as dmake was exiting after
processing the GCC non-zero exit.
@mohawk2
mohawk2force-pushed the master branch 10 times, most recently from a5fd843 to 920ca5eCompareApril 13, 2019 01:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bulk88
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Vc cc improvements - #16

Open
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements
Open

Vc cc improvements#16
bulk88 wants to merge 15 commits into
mohawk2:masterfrom
bulk88:vc_cc_improvements

Conversation

@bulk88

Copy link
Copy Markdown
Contributor

fix a syntax error with VC 6, make a "release" optimized VC 6 option, VC 2005 and newer warnings fixes, a slight perf improvement on VC 2005 and newer as compared to the previous situation, but VC 2003 and earlier builds will always be faster than a VC 2005 or newer build of dmake. The vast majority of stdio is not available in _nolock versions thanks to MS so only fputc got optimized to a nolock version, its still something.

unix/dcache:
- make extern.h be first for Win32 warnings disable
unix/runargv.c:
- extern.h includes signal.h, specifying signal.h before extern.h causes
the Win32 specific defines which disable warnings to be skipped, the
reason for signal.h before extern.h is before git history and is
therefore unknown
win95/switchar.c:
- all 3 includes are in extern.h
In MS and Mingw's headers, there is no define from fputc to _fputc_nolock.
This has to be done manually.
mingw 4.6.3 has _fputc_nolock in its headers so use it.
VC6 doesn't understand ULL suffix (only UI64), >= VC 2003 understand ULL,
to make things simple, just drop the suffix. This was a syntax error on
VC6.
Previously a VC6 build was built with -Od, this is inefficient, and not
needed since the vast majority of dmake users will never C debug it. make
mk.bat similar to mk70.bat. I dont think anyone wants the COFF and CV
symbol formats, they bloat dmake.exe by 10s of KBs. My VC 2003 C debugger
understood the VC 6 PDB without a problem but not the legacy symbol
formats.
64 bit seems to work, no fixes or anything special needs to be done, just
use the right vcvars*.bat file to select the right cl.exe
the Win32 implementation of readdir (FindNextFile) gives the mtime unlike
on unix, so no need to chdir, so a relative stat() call later works, since
no stat call is done. This saves 2 chdirs per directory enumerated and
cached and there are about 3-5 dirs for a Perl ExtUtils::MakeMaker build
and 5-8 dirs for Perl core build enumerated.On VC 2003, each chdir is
22us wall time with children according to my C profiler. On VC >= 2005
chdir is more expensive since a number of locks are acquired since MS
dropped the single threaded static libc. The vast majority of chdirs come
from finished_child, not CacheStat, for example, in parallel building
perl interp, for me 317 calls chdirs dropped to 302 after this patch.
In Def_recipe dont assign NULL to a calloc-ed struct and don't check for
rcp being NULL, as it was already checked for NULL in Add_recipe_to_list
which is the only caller of Def_recipe.
In Add_recipe_to_list, remove the NULL check, all callers of
Add_recipe_to_list will never pass a NULL, the callers are Parse and
Parse_rule_def.
In DmStrDup, don't compute strlen twice, once explicitly, the other time
inside strcpy. Anyways, memcpy is more deterministic to the CPU as to end
of the copying loop, than strcpy.
In Parse_macro, reduce the liveness of var cp, the newly created var sp
will replace var cp's C stack or non-vol reg slot instead of both sp and
cp being saved around the DmStrDup call.
Previously, if none of the chars are found, another loop (strlen())
through the string must be done. With strcspn, another loop isn't done,
just 1 add instruction.
see explanation in commit
"use strpbrk instead of textbook inefficient roll your own version"
@bulk88

Copy link
Copy Markdown
ContributorAuthor

added more comits, here is a before (at commit "eliminate chdir from CacheStat on Win32") and
after (at commit "DmStrSpn: use strspn instead of self rolling outselves"). Most notable, 3537077-3343092=193985 calls to strchr were removed because of the DmStrSpn change, but in the after DmStrSpn and strspn only executed, 186193 times, which means 193985-186193=7792 times the original self rolled rolled version called strchr more than once, and did more than 1 pass through the string. There is some time savings in DmStrPbrk, which went from 0.48 us to 0.46 us in "average with children", this is because of the strlen removal, although I have no data from the profiler on how often that old strlen branch executed in DmStrPbrk (strlen is an "intrinsic" and is inlined and is not profilable). DmStrSpn actually stayed the same time wise at 0.42 us. Note this profiler stops inlining of most of dmake's code. In a non-instrumented -O2 dmake DmStrPbrk and DmStrSpn are always inlined, since those null checks on its args are often optimized away by VC.
more strings b4
more strings after

Remove_file and the "!" operator are always inlined into the caller into
a test asm op then conditional jump on VC 2003 -O2.
fclose contains a fflush or equivelent call per posix/C. Calling fflush
after every line will mean <=80 byte writes to the disk/FS driver/kernel.
Calling fflush after every write of a line console is understandable, for
a disk it isn't. By removing/merging the fflush with fclose, in most cases
the entire temp file will be buffered in stdio in user mode and sent to the
kernel only when the file is closed. Move the error check to fclose. On
VS >= 2005, this also means that the MT lock will be aquired once for the
fclose, not once (or more) for fflush then again for fclose.
My test workload for dmake (a perl build) makes 3 temp files per
"dmake all". The number of fflush calls was reduced from 140 to 137 with
this patch. The number of WriteFile calls stayed the same at 145, probably
since the temp files are 1 line long. The majority of fflush calls are
writing to console in my workload.
I didn't realize dmstr2 existed when I created STRINGIFY and DM_StGiFy, so
remove my API names in favor dmake's older (and more authoritative) names.
commit "Stop tracking autoconf-generated files." discontinued distributing
configure
the winnt bat file builds are generally broken, but sychronize them to
avoid more rotting
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 72edc11 to 68d9de8CompareMarch 18, 2015 03:55
done with cygwin autoconf, no gcc installed, vcvars32.bat env vars set from
VC 6, macros that were undefed were not included in this commit, also
autoconf undefed HAVE_UTIME_NULL, so leave the former hand set
HAVE_UTIME_NULL on.
@bulk88
bulk88force-pushed the vc_cc_improvements branch from 68d9de8 to f6abcc2CompareMarch 18, 2015 04:41
The error I (bulk88) saw was
checking the operating system... configure: error: MINGW32_NT-5.1 operating syst
em is not suitable to build dmake!
*returned to prompt*
In commit
"dont call fflush for each line written when generating a tmp file" I
stopped flushing the fd of a temp file after every line, but that
introduced a new bug, since Close_temp was not always closing a fd (IDK if
that is intentional or not) even though it looked like it did. Change
Close_temp to fflush the fd if it wasn't fclose-d. The bug presented itself
as a temp file being empty when GCC read it, but examining the temp showed
it was filled correctly because it was filled as dmake was exiting after
processing the GCC non-zero exit.
@mohawk2
mohawk2force-pushed the master branch 10 times, most recently from a5fd843 to 920ca5eCompareApril 13, 2019 01:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bulk88