delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2010/11/29/08:23:21

X-Recipient: archive-cygwin AT delorie DOT com
X-SWARE-Spam-Status: No, hits=-1.0 required=5.0 tests=AWL,BAYES_40,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,T_TO_NO_BRKTS_FREEMAIL
X-Spam-Check-By: sourceware.org
Message-ID: <4CF3A930.40404@gmail.com>
Date: Mon, 29 Nov 2010 05:22:56 -0800
From: Daniel Colascione <dan DOT colascione AT gmail DOT com>
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6
MIME-Version: 1.0
To: cygwin AT cygwin DOT com
Subject: /etc/profile optimization and correctness
X-IsSubscribed: yes
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

--------------enig3831C2B1D25AE248EEDE6F55
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Starting a login shell on my system takes a painfully long time, mostly
because fork() is pretty slow on WOW6432 systems. I've taken a look at
the shell initialization routines and identified some potential savings:

- Can't we use USERNAME to set USER instead of running `id -un`?

- Move the /tmp chmod to the user-home-directory-doesn't-exist-case, or
better yet, get rid of it altogether and move /tmp permission setting to
install scripts

- Detect the current shell by examining BASH_VERSION, ZSH_VERSION, and
so on, not by forking for the echo|tr|sed pipeline.

- Use this code to run the profile.d scripts:
saved_LC_COLLATE=3D$LC_COLLATE
LC_COLLATE=3DC
for file in /etc/profile.d/*.{sh,zsh}; do
  LC_COLLATE=3D$saved_LC_COLLATE
  test -a "$file" && . "$file"
done
unset saved_LC_COLLATE

- The default /etc/profile exports PS1. Please don't do that: it causes
weird issues with Emacs tramp; it causes other shells that interpret PS1
differently (like zsh) to do odd things; and it uses up precious
environment-block space. Better to set PS1 in bashrc.

- There's a useless uname -s invocation: since Cygwin doesn't run on
Windows 9x anymore (and good riddance!), the first branch of the
conditional is always taken. (Saves two forks.)

- Replace the invocation of regtool with a direct read from
/proc/registry. That is, instead of

# Three forks
PRINTER=3D"`regtool -q get '\user\Software\Microsoft\Windows
NT\CurrentVersion\Windows\Device' | sed 's/,.*$//'`"

use

# Zero forks
read -r PRINTER <
'/proc/registry/HKEY_CURRENT_USER/Software/Microsoft/Windows
NT/CurrentVersion/Windows/Device'
export PRINTER=3D${PRINTER%%,*}



I've modified my own /etc/profile. It ends up being an order of
magnitude faster than the stock version:

dancol AT xyzzy ~
$ time . /etc/defaults/etc/profile

real	0m1.012s
user	0m0.075s
sys	0m0.318s

dancol AT xyzzy ~
$ time . /etc/profile

real	0m0.104s
user	0m0.015s
sys	0m0.015s





--------------enig3831C2B1D25AE248EEDE6F55
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (Darwin)

iEYEARECAAYFAkzzqTIACgkQ17c2LVA10VvxWACdEmZSVWqKd1bUqV/gcfxMr/81
F6EAn2uUiGebTypWDE2WpjrxzuA1My/J
=E0gG
-----END PGP SIGNATURE-----

--------------enig3831C2B1D25AE248EEDE6F55--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019