首页 > 解决方案 > 单线程运行比 2 线程运行慢 6 倍

问题描述

我正在尝试优化Linux 手册页Makefile并改进其功能。

之前,它只有make uninstalland make install,它们都运行一个在单线程中运行的小型 shell 脚本,在我的笔记本电脑(i7-8850H6C/12T)上需要 5 到 10 秒。

我添加了仅安装某些部分(例如,man3/仅)的可能性make install-man3

这也使得并行安装所有东西成为可能,从而允许make -j install.

使用多线程大大缩短了安装时间,但现在使用单线程安装也大大增加了安装时间。为了比较,这些是我笔记本电脑上的时间(make与 相同make uninstall && make install):

旧的 Makefile:

~/src/linux/man-pages$ time sudo make >/dev/null
    
real    0m7.509s
user    0m5.269s
sys     0m2.614s

旧 makefile 的时间变化很大,在 5 到 10 秒之间。

新生成文件:

~/src/linux/man-pages$ time sudo make >/dev/null
    
real    0m27.883s
user    0m18.257s
sys     0m10.735s
~/src/linux/man-pages$ time sudo make -j2 >/dev/null

real    0m4.636s
user    0m8.514s
sys     0m1.475s
~/src/linux/man-pages$ time sudo make -j4 >/dev/null
    
real    0m2.582s
user    0m8.400s
sys     0m1.369s
~/src/linux/man-pages$ time sudo make -j >/dev/null
    
real    0m2.071s
user    0m9.203s
sys     0m1.704s

这些新时代非常一致。

如果我跑步,make -n我会得到非常少的时间,所以我认为这不是开销,而是正在完成的实际工作:

~/src/linux/man-pages$ time sudo make -n >/dev/null

real    0m1.086s
user    0m1.116s
sys     0m0.117s
~/src/linux/man-pages$ time sudo make -nj >/dev/null

real    0m0.652s
user    0m1.269s
sys     0m0.146s

我正在使用的当前(新)Makefile 是(在删除了一些无趣的部分之后):

Makefile

SHELL := /bin/bash -Eeuo pipefail

MAKEFLAGS += --no-print-directory
MAKEFLAGS += --silent

ROOTDIR := $(CURDIR)

DESTDIR :=
prefix := /usr/local
datarootdir := $(prefix)/share
MANDIR := $(ROOTDIR)
mandir := $(datarootdir)/man
MAN1DIR := $(MANDIR)/man1
MAN2DIR := $(MANDIR)/man2
MAN3DIR := $(MANDIR)/man3
MAN4DIR := $(MANDIR)/man4
MAN5DIR := $(MANDIR)/man5
MAN6DIR := $(MANDIR)/man6
MAN7DIR := $(MANDIR)/man7
MAN8DIR := $(MANDIR)/man8
man1dir := $(mandir)/man1
man2dir := $(mandir)/man2
man3dir := $(mandir)/man3
man4dir := $(mandir)/man4
man5dir := $(mandir)/man5
man6dir := $(mandir)/man6
man7dir := $(mandir)/man7
man8dir := $(mandir)/man8
man1ext := \.1
man2ext := \.2
man3ext := \.3
man4ext := \.4
man5ext := \.5
man6ext := \.6
man7ext := \.7
man8ext := \.8

INSTALL := install
INSTALL_DATA := $(INSTALL) -m 644
INSTALL_DIR := $(INSTALL) -m 755 -d
RM := rm -f
RMDIR := rmdir --ignore-fail-on-non-empty


.PHONY: all
all:
    $(MAKE) uninstall;
    $(MAKE) install;


%/:
    @echo ' INSTALL $@';
    $(INSTALL_DIR) $@;


.PHONY: install
install: install-man

.PHONY: uninstall remove
uninstall remove: uninstall-man

################################################################################
# man

MAN1PAGES := $(shell find $(MAN1DIR) -type f | grep '$(man1ext)$$' | sort)
MAN2PAGES := $(shell find $(MAN2DIR) -type f | grep '$(man2ext)$$' | sort)
MAN3PAGES := $(shell find $(MAN3DIR) -type f | grep '$(man3ext)$$' | sort)
MAN4PAGES := $(shell find $(MAN4DIR) -type f | grep '$(man4ext)$$' | sort)
MAN5PAGES := $(shell find $(MAN5DIR) -type f | grep '$(man5ext)$$' | sort)
MAN6PAGES := $(shell find $(MAN6DIR) -type f | grep '$(man6ext)$$' | sort)
MAN7PAGES := $(shell find $(MAN7DIR) -type f | grep '$(man7ext)$$' | sort)
MAN8PAGES := $(shell find $(MAN8DIR) -type f | grep '$(man8ext)$$' | sort)

man1pages := $(patsubst $(MANDIR)/%,$(DESTDIR)$(mandir)/%,$(MAN1PAGES))
man2pages := $(patsubst $(MANDIR)/%,$(DESTDIR)$(mandir)/%,$(MAN2PAGES))
man3pages := $(patsubst $(MANDIR)/%,$(DESTDIR)$(mandir)/%,$(MAN3PAGES))
man4pages := $(patsubst $(MANDIR)/%,$(DESTDIR)$(mandir)/%,$(MAN4PAGES))
man5pages := $(patsubst $(MANDIR)/%,$(DESTDIR)$(mandir)/%,$(MAN5PAGES))
man6pages := $(patsubst $(MANDIR)/%,$(DESTDIR)$(mandir)/%,$(MAN6PAGES))
man7pages := $(patsubst $(MANDIR)/%,$(DESTDIR)$(mandir)/%,$(MAN7PAGES))
man8pages := $(patsubst $(MANDIR)/%,$(DESTDIR)$(mandir)/%,$(MAN8PAGES))
manpages  := $(man1pages) \
             $(man2pages) \
             $(man3pages) \
             $(man4pages) \
             $(man5pages) \
             $(man6pages) \
             $(man7pages) \
             $(man8pages)

$(manpages): $(DESTDIR)$(mandir)/%: $(MANDIR)/%
    @echo ' INSTALL $@';
    $(INSTALL_DATA) -T '$(MANDIR)/$*' '$@';


INSTALL_MANn := install-man1 \
                install-man2 \
                install-man3 \
                install-man4 \
                install-man5 \
                install-man6 \
                install-man7 \
                install-man8

.PHONY: $(INSTALL_MANn)
$(INSTALL_MANn): install-%: | installdirs-%
    $(MAKE) '_install-$*';

.PHONY: install-man
install-man: $(INSTALL_MANn)
    @:;

.PHONY: _install-man1
_install-man1: $(man1pages)
.PHONY: _install-man2
_install-man2: $(man2pages)
.PHONY: _install-man3
_install-man3: $(man3pages)
.PHONY: _install-man4
_install-man4: $(man4pages)
.PHONY: _install-man5
_install-man5: $(man5pages)
.PHONY: _install-man6
_install-man6: $(man6pages)
.PHONY: _install-man7
_install-man7: $(man7pages)
.PHONY: _install-man8
_install-man8: $(man8pages)


INSTALLDIRS_MANn := installdirs-man1 \
                    installdirs-man2 \
                    installdirs-man3 \
                    installdirs-man4 \
                    installdirs-man5 \
                    installdirs-man6 \
                    installdirs-man7 \
                    installdirs-man8

.PHONY: $(INSTALLDIRS_MANn)
$(INSTALLDIRS_MANn): installdirs-%: $(DESTDIR)$(mandir)/%/ | installdirs-man
    @:;

.PHONY: installdirs-man
installdirs-man: $(DESTDIR)$(mandir)/
    @:;


uninstall_man1pages := $(addprefix uninstall-,$(wildcard $(man1pages)))
uninstall_man2pages := $(addprefix uninstall-,$(wildcard $(man2pages)))
uninstall_man3pages := $(addprefix uninstall-,$(wildcard $(man3pages)))
uninstall_man4pages := $(addprefix uninstall-,$(wildcard $(man4pages)))
uninstall_man5pages := $(addprefix uninstall-,$(wildcard $(man5pages)))
uninstall_man6pages := $(addprefix uninstall-,$(wildcard $(man6pages)))
uninstall_man7pages := $(addprefix uninstall-,$(wildcard $(man7pages)))
uninstall_man8pages := $(addprefix uninstall-,$(wildcard $(man8pages)))
uninstall_manpages  := $(uninstall_man1pages) \
                       $(uninstall_man2pages) \
                       $(uninstall_man3pages) \
                       $(uninstall_man4pages) \
                       $(uninstall_man5pages) \
                       $(uninstall_man6pages) \
                       $(uninstall_man7pages) \
                       $(uninstall_man8pages)

.PHONY: $(uninstall_manpages)
$(uninstall_manpages): uninstall-%:
    @echo ' RM  $*';
    $(RM) '$*';


UNINSTALL_MANn := uninstall-man1 \
                  uninstall-man2 \
                  uninstall-man3 \
                  uninstall-man4 \
                  uninstall-man5 \
                  uninstall-man6 \
                  uninstall-man7 \
                  uninstall-man8

uninstall-man1: $(uninstall_man1pages)
uninstall-man2: $(uninstall_man2pages)
uninstall-man3: $(uninstall_man3pages)
uninstall-man4: $(uninstall_man4pages)
uninstall-man5: $(uninstall_man5pages)
uninstall-man6: $(uninstall_man6pages)
uninstall-man7: $(uninstall_man7pages)
uninstall-man8: $(uninstall_man8pages)

.PHONY: $(UNINSTALL_MANn)
$(UNINSTALL_MANn): uninstall-%:
    @echo ' RMDIR   $(DESTDIR)$(mandir)/$*/';
    $(RMDIR) '$(DESTDIR)$(mandir)/$*/' 2>/dev/null ||:;

.PHONY: uninstall-man
uninstall-man: $(UNINSTALL_MANn)
    @echo ' RMDIR   $(DESTDIR)$(mandir)/';
    $(RMDIR) '$(DESTDIR)$(mandir)/' ||:;

我的问题是:

为什么单线程运行这么慢?比 2 个线程慢 6 倍??


编辑: 显示--trace

Makefile:54: target 'all' does not exist
make uninstall;
Makefile:176: target 'uninstall-/usr/local/share/man/man1/getent.1' does not exist
echo '  RM  /usr/local/share/man/man1/getent.1';
    RM  /usr/local/share/man/man1/getent.1
rm -f '/usr/local/share/man/man1/getent.1';
...XXX...
Makefile:176: target 'uninstall-/usr/local/share/man/man1/time.1' does not exist
echo '  RM  /usr/local/share/man/man1/time.1';
    RM  /usr/local/share/man/man1/time.1
rm -f '/usr/local/share/man/man1/time.1';
Makefile:200: update target 'uninstall-man1' due to: uninstall-/usr/local/share/man/man1/getent.1 ...XXX... uninstall-/usr/local/share/man/man1/time.1
echo '  RMDIR   /usr/local/share/man/man1/';
    RMDIR   /usr/local/share/man/man1/
rmdir --ignore-fail-on-non-empty '/usr/local/share/man/man1/' 2>/dev/null ||:;
Makefile:176: target 'uninstall-/usr/local/share/man/man2/accept.2' does not exist
echo '  RM  /usr/local/share/man/man2/accept.2';
    RM  /usr/local/share/man/man2/accept.2
rm -f '/usr/local/share/man/man2/accept.2';
...XXX...
Makefile:176: target 'uninstall-/usr/local/share/man/man2/writev.2' does not exist
echo '  RM  /usr/local/share/man/man2/writev.2';
    RM  /usr/local/share/man/man2/writev.2
rm -f '/usr/local/share/man/man2/writev.2';
Makefile:200: update target 'uninstall-man2' due to: uninstall-/usr/local/share/man/man2/accept.2 ...XXX... uninstall-/usr/local/share/man/man2/writev.2
echo '  RMDIR   /usr/local/share/man/man2/';
    RMDIR   /usr/local/share/man/man2/
rmdir --ignore-fail-on-non-empty '/usr/local/share/man/man2/' 2>/dev/null ||:;
Makefile:176: target 'uninstall-/usr/local/share/man/man3/a64l.3' does not exist
echo '  RM  /usr/local/share/man/man3/a64l.3';
    RM  /usr/local/share/man/man3/a64l.3
rm -f '/usr/local/share/man/man3/a64l.3';
...XXX...
Makefile:176: target 'uninstall-/usr/local/share/man/man3/ynl.3' does not exist
echo '  RM  /usr/local/share/man/man3/ynl.3';
    RM  /usr/local/share/man/man3/ynl.3
rm -f '/usr/local/share/man/man3/ynl.3';
Makefile:200: update target 'uninstall-man3' due to: uninstall-/usr/local/share/man/man3/a64l.3 ...XXX... uninstall-/usr/local/share/man/man3/ynl.3
echo '  RMDIR   /usr/local/share/man/man3/';
    RMDIR   /usr/local/share/man/man3/
rmdir --ignore-fail-on-non-empty '/usr/local/share/man/man3/' 2>/dev/null ||:;
Makefile:176: target 'uninstall-/usr/local/share/man/man4/cciss.4' does not exist
echo '  RM  /usr/local/share/man/man4/cciss.4';
    RM  /usr/local/share/man/man4/cciss.4
rm -f '/usr/local/share/man/man4/cciss.4';
...XXX...
Makefile:176: target 'uninstall-/usr/local/share/man/man4/zero.4' does not exist
echo '  RM  /usr/local/share/man/man4/zero.4';
    RM  /usr/local/share/man/man4/zero.4
rm -f '/usr/local/share/man/man4/zero.4';
Makefile:200: update target 'uninstall-man4' due to: uninstall-/usr/local/share/man/man4/cciss.4 ...XXX... uninstall-/usr/local/share/man/man4/zero.4
echo '  RMDIR   /usr/local/share/man/man4/';
    RMDIR   /usr/local/share/man/man4/
rmdir --ignore-fail-on-non-empty '/usr/local/share/man/man4/' 2>/dev/null ||:;
Makefile:176: target 'uninstall-/usr/local/share/man/man5/acct.5' does not exist
echo '  RM  /usr/local/share/man/man5/acct.5';
    RM  /usr/local/share/man/man5/acct.5
rm -f '/usr/local/share/man/man5/acct.5';
...XXX...
Makefile:176: target 'uninstall-/usr/local/share/man/man5/wtmp.5' does not exist
echo '  RM  /usr/local/share/man/man5/wtmp.5';
    RM  /usr/local/share/man/man5/wtmp.5
rm -f '/usr/local/share/man/man5/wtmp.5';
Makefile:200: update target 'uninstall-man5' due to: uninstall-/usr/local/share/man/man5/acct.5 ...XXX... uninstall-/usr/local/share/man/man5/wtmp.5
echo '  RMDIR   /usr/local/share/man/man5/';
    RMDIR   /usr/local/share/man/man5/
rmdir --ignore-fail-on-non-empty '/usr/local/share/man/man5/' 2>/dev/null ||:;
Makefile:176: target 'uninstall-/usr/local/share/man/man6/intro.6' does not exist
echo '  RM  /usr/local/share/man/man6/intro.6';
    RM  /usr/local/share/man/man6/intro.6
rm -f '/usr/local/share/man/man6/intro.6';
Makefile:200: update target 'uninstall-man6' due to: uninstall-/usr/local/share/man/man6/intro.6
echo '  RMDIR   /usr/local/share/man/man6/';
    RMDIR   /usr/local/share/man/man6/
rmdir --ignore-fail-on-non-empty '/usr/local/share/man/man6/' 2>/dev/null ||:;
Makefile:176: target 'uninstall-/usr/local/share/man/man7/address_families.7' does not exist
echo '  RM  /usr/local/share/man/man7/address_families.7';
    RM  /usr/local/share/man/man7/address_families.7
rm -f '/usr/local/share/man/man7/address_families.7';
...XXX...
Makefile:176: target 'uninstall-/usr/local/share/man/man7/xattr.7' does not exist
echo '  RM  /usr/local/share/man/man7/xattr.7';
    RM  /usr/local/share/man/man7/xattr.7
rm -f '/usr/local/share/man/man7/xattr.7';
Makefile:200: update target 'uninstall-man7' due to: uninstall-/usr/local/share/man/man7/address_families.7 ...XXX... uninstall-/usr/local/share/man/man7/xattr.7
echo '  RMDIR   /usr/local/share/man/man7/';
    RMDIR   /usr/local/share/man/man7/
rmdir --ignore-fail-on-non-empty '/usr/local/share/man/man7/' 2>/dev/null ||:;
Makefile:176: target 'uninstall-/usr/local/share/man/man8/iconvconfig.8' does not exist
echo '  RM  /usr/local/share/man/man8/iconvconfig.8';
    RM  /usr/local/share/man/man8/iconvconfig.8
rm -f '/usr/local/share/man/man8/iconvconfig.8';
...XXX...
Makefile:176: target 'uninstall-/usr/local/share/man/man8/zic.8' does not exist
echo '  RM  /usr/local/share/man/man8/zic.8';
    RM  /usr/local/share/man/man8/zic.8
rm -f '/usr/local/share/man/man8/zic.8';
Makefile:200: update target 'uninstall-man8' due to: uninstall-/usr/local/share/man/man8/iconvconfig.8 ...XXX... uninstall-/usr/local/share/man/man8/zic.8
echo '  RMDIR   /usr/local/share/man/man8/';
    RMDIR   /usr/local/share/man/man8/
rmdir --ignore-fail-on-non-empty '/usr/local/share/man/man8/' 2>/dev/null ||:;
Makefile:205: update target 'uninstall-man' due to: uninstall-man1 uninstall-man2 uninstall-man3 uninstall-man4 uninstall-man5 uninstall-man6 uninstall-man7 uninstall-man8
echo '  RMDIR   /usr/local/share/man/';
    RMDIR   /usr/local/share/man/
rmdir --ignore-fail-on-non-empty '/usr/local/share/man/' ||:;
make install;
Makefile:154: update target 'installdirs-man' due to: /usr/local/share/man/
:;
Makefile:150: update target 'installdirs-man1' due to: /usr/local/share/man/man1/
:;
Makefile:115: target 'install-man1' does not exist
make '_install-man1';
Makefile:100: update target '/usr/local/share/man/man1/getent.1' due to: /home/user/src/linux/man-pages/man1/getent.1
echo '  INSTALL /usr/local/share/man/man1/getent.1';
    INSTALL /usr/local/share/man/man1/getent.1
install -m 644 -T '/home/user/src/linux/man-pages/man1/getent.1' '/usr/local/share/man/man1/getent.1';
...XXX...
Makefile:100: update target '/usr/local/share/man/man1/time.1' due to: /home/user/src/linux/man-pages/man1/time.1
echo '  INSTALL /usr/local/share/man/man1/time.1';
    INSTALL /usr/local/share/man/man1/time.1
install -m 644 -T '/home/user/src/linux/man-pages/man1/time.1' '/usr/local/share/man/man1/time.1';
Makefile:150: update target 'installdirs-man2' due to: /usr/local/share/man/man2/
:;
Makefile:115: target 'install-man2' does not exist
make '_install-man2';
Makefile:100: update target '/usr/local/share/man/man2/accept.2' due to: /home/user/src/linux/man-pages/man2/accept.2
echo '  INSTALL /usr/local/share/man/man2/accept.2';
    INSTALL /usr/local/share/man/man2/accept.2
install -m 644 -T '/home/user/src/linux/man-pages/man2/accept.2' '/usr/local/share/man/man2/accept.2';
...XXX...
Makefile:100: update target '/usr/local/share/man/man2/writev.2' due to: /home/user/src/linux/man-pages/man2/writev.2
echo '  INSTALL /usr/local/share/man/man2/writev.2';
    INSTALL /usr/local/share/man/man2/writev.2
install -m 644 -T '/home/user/src/linux/man-pages/man2/writev.2' '/usr/local/share/man/man2/writev.2';
Makefile:150: update target 'installdirs-man3' due to: /usr/local/share/man/man3/
:;
Makefile:115: target 'install-man3' does not exist
make '_install-man3';
Makefile:100: update target '/usr/local/share/man/man3/a64l.3' due to: /home/user/src/linux/man-pages/man3/a64l.3
echo '  INSTALL /usr/local/share/man/man3/a64l.3';
    INSTALL /usr/local/share/man/man3/a64l.3
install -m 644 -T '/home/user/src/linux/man-pages/man3/a64l.3' '/usr/local/share/man/man3/a64l.3';
...XXX...
Makefile:100: update target '/usr/local/share/man/man3/ynl.3' due to: /home/user/src/linux/man-pages/man3/ynl.3
echo '  INSTALL /usr/local/share/man/man3/ynl.3';
    INSTALL /usr/local/share/man/man3/ynl.3
install -m 644 -T '/home/user/src/linux/man-pages/man3/ynl.3' '/usr/local/share/man/man3/ynl.3';
Makefile:59: target '/usr/local/share/man/man4/' does not exist
echo '  INSTALL /usr/local/share/man/man4/';
    INSTALL /usr/local/share/man/man4/
install -m 755 -d /usr/local/share/man/man4/;
Makefile:150: update target 'installdirs-man4' due to: /usr/local/share/man/man4/
:;
Makefile:115: target 'install-man4' does not exist
make '_install-man4';
Makefile:100: update target '/usr/local/share/man/man4/cciss.4' due to: /home/user/src/linux/man-pages/man4/cciss.4
echo '  INSTALL /usr/local/share/man/man4/cciss.4';
    INSTALL /usr/local/share/man/man4/cciss.4
install -m 644 -T '/home/user/src/linux/man-pages/man4/cciss.4' '/usr/local/share/man/man4/cciss.4';
...XXX...
Makefile:100: update target '/usr/local/share/man/man4/zero.4' due to: /home/user/src/linux/man-pages/man4/zero.4
echo '  INSTALL /usr/local/share/man/man4/zero.4';
    INSTALL /usr/local/share/man/man4/zero.4
install -m 644 -T '/home/user/src/linux/man-pages/man4/zero.4' '/usr/local/share/man/man4/zero.4';
Makefile:59: target '/usr/local/share/man/man5/' does not exist
echo '  INSTALL /usr/local/share/man/man5/';
    INSTALL /usr/local/share/man/man5/
install -m 755 -d /usr/local/share/man/man5/;
Makefile:150: update target 'installdirs-man5' due to: /usr/local/share/man/man5/
:;
Makefile:115: target 'install-man5' does not exist
make '_install-man5';
Makefile:100: update target '/usr/local/share/man/man5/acct.5' due to: /home/user/src/linux/man-pages/man5/acct.5
echo '  INSTALL /usr/local/share/man/man5/acct.5';
    INSTALL /usr/local/share/man/man5/acct.5
install -m 644 -T '/home/user/src/linux/man-pages/man5/acct.5' '/usr/local/share/man/man5/acct.5';
...XXX...
Makefile:100: update target '/usr/local/share/man/man5/wtmp.5' due to: /home/user/src/linux/man-pages/man5/wtmp.5
echo '  INSTALL /usr/local/share/man/man5/wtmp.5';
    INSTALL /usr/local/share/man/man5/wtmp.5
install -m 644 -T '/home/user/src/linux/man-pages/man5/wtmp.5' '/usr/local/share/man/man5/wtmp.5';
Makefile:59: target '/usr/local/share/man/man6/' does not exist
echo '  INSTALL /usr/local/share/man/man6/';
    INSTALL /usr/local/share/man/man6/
install -m 755 -d /usr/local/share/man/man6/;
Makefile:150: update target 'installdirs-man6' due to: /usr/local/share/man/man6/
:;
Makefile:115: target 'install-man6' does not exist
make '_install-man6';
Makefile:100: update target '/usr/local/share/man/man6/intro.6' due to: /home/user/src/linux/man-pages/man6/intro.6
echo '  INSTALL /usr/local/share/man/man6/intro.6';
    INSTALL /usr/local/share/man/man6/intro.6
install -m 644 -T '/home/user/src/linux/man-pages/man6/intro.6' '/usr/local/share/man/man6/intro.6';
Makefile:59: target '/usr/local/share/man/man7/' does not exist
echo '  INSTALL /usr/local/share/man/man7/';
    INSTALL /usr/local/share/man/man7/
install -m 755 -d /usr/local/share/man/man7/;
Makefile:150: update target 'installdirs-man7' due to: /usr/local/share/man/man7/
:;
Makefile:115: target 'install-man7' does not exist
make '_install-man7';
Makefile:100: update target '/usr/local/share/man/man7/address_families.7' due to: /home/user/src/linux/man-pages/man7/address_families.7
echo '  INSTALL /usr/local/share/man/man7/address_families.7';
    INSTALL /usr/local/share/man/man7/address_families.7
install -m 644 -T '/home/user/src/linux/man-pages/man7/address_families.7' '/usr/local/share/man/man7/address_families.7';
...XXX...
Makefile:100: update target '/usr/local/share/man/man7/xattr.7' due to: /home/user/src/linux/man-pages/man7/xattr.7
echo '  INSTALL /usr/local/share/man/man7/xattr.7';
    INSTALL /usr/local/share/man/man7/xattr.7
install -m 644 -T '/home/user/src/linux/man-pages/man7/xattr.7' '/usr/local/share/man/man7/xattr.7';
Makefile:59: target '/usr/local/share/man/man8/' does not exist
echo '  INSTALL /usr/local/share/man/man8/';
    INSTALL /usr/local/share/man/man8/
install -m 755 -d /usr/local/share/man/man8/;
Makefile:150: update target 'installdirs-man8' due to: /usr/local/share/man/man8/
:;
Makefile:115: target 'install-man8' does not exist
make '_install-man8';
Makefile:100: update target '/usr/local/share/man/man8/iconvconfig.8' due to: /home/user/src/linux/man-pages/man8/iconvconfig.8
echo '  INSTALL /usr/local/share/man/man8/iconvconfig.8';
    INSTALL /usr/local/share/man/man8/iconvconfig.8
install -m 644 -T '/home/user/src/linux/man-pages/man8/iconvconfig.8' '/usr/local/share/man/man8/iconvconfig.8';
...XXX...
Makefile:100: update target '/usr/local/share/man/man8/zic.8' due to: /home/user/src/linux/man-pages/man8/zic.8
echo '  INSTALL /usr/local/share/man/man8/zic.8';
    INSTALL /usr/local/share/man/man8/zic.8
install -m 644 -T '/home/user/src/linux/man-pages/man8/zic.8' '/usr/local/share/man/man8/zic.8';
Makefile:119: update target 'install-man' due to: install-man1 install-man2 install-man3 install-man4 install-man5 install-man6 install-man7 install-man8
:;

编辑:删除echo

我删除echo了行,并获得了非常重要的改进(在单线程和多线程模式下都快了大约 30%):

~/src/linux/man-pages$ time sudo make >/dev/null

real    0m20.190s
user    0m11.629s
sys     0m7.177s
~/src/linux/man-pages$ time sudo make -j2 >/dev/null

real    0m2.917s
user    0m5.469s
sys     0m1.046s
~/src/linux/man-pages$ time sudo make -j >/dev/null

real    0m1.434s
user    0m5.906s
sys     0m1.170s

编辑: 删除实际工作线

~/src/linux/man-pages$ time sudo make >/dev/null

real    0m7.260s
user    0m5.445s
sys 0m2.110s
~/src/linux/man-pages$ time sudo make -j2 >/dev/null

real    0m1.754s
user    0m2.798s
sys 0m0.411s
~/src/linux/man-pages$ time sudo make -j >/dev/null

real    0m1.229s
user    0m3.059s
sys 0m0.402s

如果echo我删除了执行实际工作的行而不是行,我会得到其余的改进。

看起来大部分时间实际上是在工作中发生的,但是如何通过使用来改善这么多-j2呢?也许我保持缓存热?

标签: makefilegnu-make

解决方案


推荐阅读