From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 31869 invoked from network); 16 Apr 2023 09:04:21 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 16 Apr 2023 09:04:21 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1681635862; b=DvlbAJByvkN2l1b/4srAkuNxSlrSS/c/C1u5NU7282u36dtybpZh7x++gWfxefXNeTG6kpVexM WSWjHj93avCfgaxUIX6OQqCunnO6vjUrbe4ElO7Rfx3tSKASr9bmLMW5qy8OBBaNUJyrVUM/sB dpu2gNDQdjCRwRETUwUkibWnzjRzuzGkEGJFTT+xEpAEJ8zu3XXtYQRL5TSqq+9klDPrHp1W14 MYh7O7AV/WJSk1BTK43yA8ULcfczLmIIpTVpxYtJAEl9SRGNKGTfLqiVLPFAqG1Ztcs5gKCWb9 XmI36XPgJ5CQjOdlBVST7GwkCf4OruZdSARh1u0V70vvVQ==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (relay6-d.mail.gandi.net) smtp.remote-ip=217.70.183.198; dmarc=none header.from=chazelas.org; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1681635862; bh=TQ6EGN/uo8XlEiQ8g2FB+9oWeS6uiCSSjabk2guwKxc=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Type:MIME-Version:Message-ID:Subject:To:From:Date: DKIM-Signature; b=ixG13UcbmAc4lISBLbOzi0owx/90QtwqA0gcm93ZSZ1WF/CoOaX1tp4AJAQubCjuHIesVlBooZ rGGtZbk9YI/vIlN+CPLr8RDclIZsSUtIjuPDjJxAPRAjOJhYCpc9Q/U/BJGM4pf/cvOku5PxrF lePv8vPtWzE0+vgPSO3jxHfQRJWV0+Rn7s09F0juiqlmX99x0pM4d+1Do1cjXdkJ/3RLo+heRT llaDIplZwrasMBEFpkNuMHm/Byuk6wKzxsKMrUhUnOVMy0SF4M0aNt2EZfgtkTqlJQhl0c1/md jFiprLgqQGjxHP8nmxjWHcC1NP6/KG7uoWg53gpgksPspg==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20210803; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Content-Type:MIME-Version:Message-ID: Subject:To:From:Date:Reply-To:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References; bh=jPjIkoVy8WHY8cU06iZOPL/oLyogWuptu/1j2L3PeHc=; b=Hm79DZ+hUt9GpN4cJlORjNUx4m 53aii/6uZyVQ2aWneActWTi5nP1iVf4rjwfOaVmTEGiuoPSgovRWr42+FGBJJiqgct77VRss3iACg k2IPfbQEjA2koBhOd9OJxeYjLwzYdBIszG2U7ZvY9Z5DeLir+/I4ydAfRzbqedAyzms3ASc2bUFWQ QdkOpKpz9gokF8NkiCyT3e0KWIWys+e3R+Bvbq71Eodnw+/XnC6q5HHaSObwTS31vyoc+avnEvu1j 4NfpUJXiPZ8guIiArJtqDcTOHfaTDl6Zs2P/9y0wPEjm4pPnPwQK4y3R+4I7I7LYn6IbuJOumve4u d9npOzqA==; Received: by zero.zsh.org with local id 1pnyJ3-000IyO-5m; Sun, 16 Apr 2023 09:04:21 +0000 Authentication-Results: zsh.org; iprev=pass (relay6-d.mail.gandi.net) smtp.remote-ip=217.70.183.198; dmarc=none header.from=chazelas.org; arc=none Received: from relay6-d.mail.gandi.net ([217.70.183.198]:37951) by zero.zsh.org with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) id 1pnyIS-000Iem-Lo; Sun, 16 Apr 2023 09:03:46 +0000 Received: (Authenticated sender: stephane@chazelas.org) by mail.gandi.net (Postfix) with ESMTPSA id CA396C0002 for ; Sun, 16 Apr 2023 09:03:43 +0000 (UTC) Date: Sun, 16 Apr 2023 10:03:42 +0100 From: Stephane Chazelas To: Zsh hackers list Subject: accessing array by index very slow Message-ID: <20230416090342.dztvzcnzpbyukgfq@chazelas.org> Mail-Followup-To: Zsh hackers list MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Seq: 51658 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: $ zsh -c 'a=($(seq 1000000)); time (for ((i=0;i<10000;i++)) { : "${a[1]}"; })' ( for ((i=0; i<10000; i++)) do; : "${a[1]}"; done; ) 0.07s user 0.03s system 96% cpu 0.102 total $ zsh -c 'a=($(seq 1000000)); time (for ((i=0;i<10000;i++)) { : "${a[999999]}"; })' ( for ((i=0; i<10000; i++)) do; : "${a[999999]}"; done; ) 14.56s user 0.06s system 99% cpu 14.616 total Accessing array elements via their index is very slow, especially for large index values. Comparing with other shells: ~$ bash -c 'a=($(seq 1000000)); time (for ((i=0;i<10000;i++)) { : "${a[999999]}"; })' real 0m0.078s user 0m0.077s sys 0m0.000s ~$ ksh -c 'a=($(seq 1000000)); time (for ((i=0;i<10000;i++)) { : "${a[999999]}"; })' real 0m00.02s user 0m00.02s sys 0m00.00s cachegrind reveals the time is spent in arrlen_ge(), as zsh needs to walk through the whole array to determine whether 999999 is past the end of the array or not. Why doesn't zsh record the length of arrays to avoid that gymnastic (and speed up $#array expansion)? -- Stephane