220 41361 <CADvuK0LeMK-uYS5WPMEMxKjfGAA6TFybpFJD_Yqh12wkOP4FcQ@mail.gmail.com> article
Path: news.gmane.org!.POSTED!not-for-mail
From: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Re: Optimizing Power Function for Integral Types
Date: Sat, 19 Jan 2019 01:59:07 -0500
Lines: 251
Approved: news@gmane.org
Message-ID: <CADvuK0LeMK-uYS5WPMEMxKjfGAA6TFybpFJD_Yqh12wkOP4FcQ@mail.gmail.com>
References: <fbfec82c-5416-4c96-b53b-ef3d4309b613@isocpp.org>
 <c5128f98-b764-4576-90fc-eda8d40d980e@isocpp.org> <1d2bd16a-c2f9-4baa-b2d3-4b0241de8992@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: blaine.gmane.org
Mime-Version: 1.0
Content-Type: multipart/related; boundary="0000000000009dc518057fca2a17"
X-Trace: blaine.gmane.org 1547881034 21753 195.159.176.226 (19 Jan 2019 06:57:14 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Sat, 19 Jan 2019 06:57:14 +0000 (UTC)
To: "ISO C++ Standard - Future Proposals" <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBDLZJYWNDQIMRFML4ICRUBH22VAMW@isocpp.org Sat Jan 19 07:57:10 2019
Return-path: <std-proposals+bncBDLZJYWNDQIMRFML4ICRUBH22VAMW@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-wm1-f71.google.com ([209.85.128.71])
	by blaine.gmane.org with esmtp (Exim 4.84_2)
	(envelope-from <std-proposals+bncBDLZJYWNDQIMRFML4ICRUBH22VAMW@isocpp.org>)
	id 1gkkZ4-0005Y3-Co
	for gclcip-std-proposals@m.gmane.org; Sat, 19 Jan 2019 07:57:10 +0100
Original-Received: by mail-wm1-f71.google.com with SMTP id o6sf1863670wmf.0
        for <gclcip-std-proposals@m.gmane.org>; Fri, 18 Jan 2019 22:59:21 -0800 (PST)
ARC-Seal: i=2; a=rsa-sha256; t=1547881161; cv=pass;
        d=google.com; s=arc-20160816;
        b=YwfhLhvYIvw0epCsnrsXAnVjWSMbwJQhuAyH4fkseBJr1EwiXTKG4DY2oX6wJ0B4cg
         K77P+G2TGWhoLrIKRHubEZeQa1Xy/avYxE2FFWh9ofQPekGuvjNH6uq8Yelx7UQqGqIa
         kRxtUrMosjyC7eYAPkjnnebYxe0nGNmZ/OZ0CE+Uetn4qo8qBLr6oKfF5y7DJljT9ZnU
         VG828PzsCIiyWM73A/yepc2HkQxfuf6ASQomgwszPDExSe0wbBOY0KKwv99WGK+3RL0h
         3ruJBUo0bV5mk64wzAupCSVNM21vzYJLwHCWk/TpvdeBZnbKdz9WqdTgarx1UjkFEQfv
         DZww==
ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
        h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post
         :list-id:mailing-list:precedence:reply-to:to:subject:message-id:date
         :from:in-reply-to:references:mime-version:dkim-signature;
        bh=LjtbErjoegzd8vnAMNcmPPvLHA4DI+nSE9PTM3vvkY0=;
        b=igHVbGi0fvu8SAjKlvEmyqfknAu/fSPnvZ/LmvVrOoGMDsgek06QQ5cEj3SqLxaqYU
         0Unj38iF6AmlbS1yUdpBsjW0gEi1WsQcZGCOgh9sGQfQa228l+VWZvDDEffkEnr0N00m
         3iVSJlANOJhu0K8EE2EiL/uWzm+SO06tiPw1FzvjWtSJMz8o2gGtzjLeq/aHa8hSx2EE
         Cz9qGkOi7hcKSZBgklfMXJPKXPvvkKYtYLSQsIE4G8ViLmzKDTpAhiAGYLgPdOLNyRuE
         ut0FqY3u+b4HlY6Uohrz+xt7c4+/uuYWbQ1fRaLvjghPjOjgQpNUCvUP/15NOuZ9Ia+4
         EHPA==
ARC-Authentication-Results: i=2; mx.google.com;
       dkim=pass header.i=@gmail.com header.s=20161025 header.b=XsVLBlj5;
       spf=pass (google.com: domain of arthur.j.odwyer@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=arthur.j.odwyer@gmail.com;
       dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=mime-version:references:in-reply-to:from:date:message-id:subject:to
         :x-original-sender:x-original-authentication-results:reply-to
         :precedence:mailing-list:list-id:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=LjtbErjoegzd8vnAMNcmPPvLHA4DI+nSE9PTM3vvkY0=;
        b=xGu0QobTaR+c4MrcsXIaWTWLct+CFNoO3GYV/a/3Jt7hyEqUDsT6mDoax0yH9m4T7Z
         7VSSWsxEEqSJCNPekd58cWrLRJTOojEKkjSEvayB/ygQnEtGIE2x+6NaRNYdoBSILrG5
         m1ujzbm/Xw+FU8OeCdlPWdAwmr50cFaUK46X5mpAF2LfVVsQpcAJES91R3B8Gwati7h/
         bbaMKlcyoBiqb6zTze8wrelpIcX/5HkoNXV0Xi5eTCyrn0GR97hjVHfRjKtACU136S0d
         uQDo9YCsqva0xGo/WhHip7j1VLIcpvdCObvm6yRsPcm0zUikA4TtLMnC4YudttpTDzPm
         9I6g==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20161025;
        h=x-gm-message-state:mime-version:references:in-reply-to:from:date
         :message-id:subject:to:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=LjtbErjoegzd8vnAMNcmPPvLHA4DI+nSE9PTM3vvkY0=;
        b=nkPvQaE6oT8Mt0JtoHQUm6Ijb6IsLVgKwge2oNBYnL1PaYAcd//0UrUaPUUkor0uE5
         3OX2C/3apm3rYPPTovC5xEa6aavBFQmcma7rfeeGeLfXDs9i2lImoOqFHGX8DVUCdpeI
         VcbWm27gYaZkvstsIr2aOtcgcPeiGMRqHOWLKCDM+TWviK0VMLSWrBTp/fWWn2svgbjm
         eSN6v7WWlGvy3mLCdlyVDKDoXjMCsERnd2Xsvsa/5Ns++i6m1nS0zHZZXpt4e/nuYNQG
         ynoOJsmWpqfHPkGIRE/gLpcGFpSZi9TVPBmWhv7Fer60LHWlLZJp64MPaGeJOBWw666F
         1Vhg==
X-Gm-Message-State: AJcUukdxg7eWbiKe/9QamQVA8n3BURoovETYQzNrvgTCLggnK1G8Nfpy
	M+ADuTFYRRomAA7ax67LNkR/4g==
X-Google-Smtp-Source: ALg8bN4yhhb3KJZHYHa7ZwrSxtm2J/BccCf33BSlDONT1c4fTys7RWGLkIfs63Too8E38yOFRPgYnA==
X-Received: by 2002:a1c:c91:: with SMTP id 139mr1892502wmm.9.1547881161375;
        Fri, 18 Jan 2019 22:59:21 -0800 (PST)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 2002:a1c:d78f:: with SMTP id o137ls852698wmg.1.gmail; Fri, 18 Jan
 2019 22:59:19 -0800 (PST)
X-Received: by 2002:a1c:1b8d:: with SMTP id b135mr12415922wmb.115.1547881159432;
        Fri, 18 Jan 2019 22:59:19 -0800 (PST)
ARC-Seal: i=1; a=rsa-sha256; t=1547881159; cv=none;
        d=google.com; s=arc-20160816;
        b=U9bysj+Yhi4KxFOXdkADWrYeHGGNQVof4QDw65olMA8N08A9g8DPMOUbqFoht2f/7b
         Dd8sbK+ZLfZacWpOtyF8QAjJEJXGf7YisY/6SKFaBeVPMMUqtwqYlRTILPW6U2DMuXwP
         oedH+KJJkwvnpbhvAFx50xzGF2TuXI2fj4KFDeFMrOY0M6yoNXz3RSj9RWVzbaIgvxoF
         KiTKQHl+wMVOM0hWTSWiDBeNYLvUD6HPL7fYCHrkAOjVqe4VC9w/jyzXa1bRQYR6iZHA
         XsEHiZo6r6gKCNXdUJtJlcAJ6Dr2qmIB7zKb4n2OzmDaO3p+uDUHxHGAqCxxmkHpIX8G
         Fimg==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
        h=to:subject:message-id:date:from:in-reply-to:references:mime-version
         :dkim-signature;
        bh=wUqdnONl6xcGwtCyptHveW6CmC3Izy1DOIWxD3lINrM=;
        b=rIOBtNurC9HvAKBqlW1kXI8NHw9T4RY76yoEccKnG9yaq1VDAitjdui6PcC1AtN4uO
         XandNUjxgX2PG+cGbZZBh9g1DB0a5Lk8eRQrYHB/DUDeg0ujWcsjjDCRJKSy3VDo5+A2
         nHQ4USgHA37zXNEFf6Rr6t9qAfzzmB/CNtMYsd1CAUetyal2uyPv/9Yxsnxta6eBuu8Y
         /mbr+WYtCldlmz2gDF68GU1Y5RXtYQBuTaWp7ChvWcp2M5nY0x8Q5/yPnGn1OiOqBynE
         6WHBLnTDDUYz2KNCNDwuyCu81JEOMJLdvv7/XmkAgWllzX72CuyD20KbWQdDoe9Fy9Q2
         imVg==
ARC-Authentication-Results: i=1; mx.google.com;
       dkim=pass header.i=@gmail.com header.s=20161025 header.b=XsVLBlj5;
       spf=pass (google.com: domain of arthur.j.odwyer@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=arthur.j.odwyer@gmail.com;
       dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
Original-Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41])
        by mx.google.com with SMTPS id b17sor60970473wrt.48.2019.01.18.22.59.19
        for <std-proposals@isocpp.org>
        (Google Transport Security);
        Fri, 18 Jan 2019 22:59:19 -0800 (PST)
Received-SPF: pass (google.com: domain of arthur.j.odwyer@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41;
X-Received: by 2002:a5d:6105:: with SMTP id v5mr18894351wrt.63.1547881158632;
 Fri, 18 Jan 2019 22:59:18 -0800 (PST)
In-Reply-To: <1d2bd16a-c2f9-4baa-b2d3-4b0241de8992@isocpp.org>
X-Original-Sender: arthur.j.odwyer@gmail.com
X-Original-Authentication-Results: mx.google.com;       dkim=pass
 header.i=@gmail.com header.s=20161025 header.b=XsVLBlj5;       spf=pass
 (google.com: domain of arthur.j.odwyer@gmail.com designates 209.85.220.41 as
 permitted sender) smtp.mailfrom=arthur.j.odwyer@gmail.com;       dmarc=pass
 (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:41361
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/41361>

--0000000000009dc518057fca2a17
Content-Type: multipart/alternative; boundary="0000000000009dc516057fca2a16"

--0000000000009dc516057fca2a16
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, Jan 18, 2019 at 8:12 PM <joel.g.hemphill@gmail.com> wrote:

> The case you pointed out of using the double-type of the return for
> 'pow(int, int)' would be a major concern. Perhaps a workaround would be t=
he
> requirement of an explicit template? i.e. "double x =3D std::pow(10, 20);=
"
> would use overload 7, whereas "std::pow<int, int>(10, 20)" would return
> int? Alternatively, as Jake Arkinstall suggested, a new syntax for 'pow' =
as
> 'power' might be in order, in which case, such contingencies wouldn't be =
as
> large a concern. I would also argue that the above code segment is poor
> practice, as it is relying upon the pow function to convert the two
> integers to doubles. More explicit typing would be preferred in most codi=
ng
> environments. Another solution, as is implemented with powl and powf, is =
to
> use a single-letter abbreviation to explicitly define the types used. i.e=
..
> powi.
>
> As for the graph; I mentioned in a reply to my original posting that I
> have since found an issue with the testing method I used for graphing the
> execution times for pow and powi. I have since done other tests as shown
> below [avg. of 20000 runs for powi, and 500 for pow (since the execution =
is
> longer, I decided to neglect the sample-count somewhat)]:
>
> [image: Untitled2.png]
>
> As you can see, powi does experience a gradual increase in execution
> length with the increasing exponents (since it needs to do at worst [if a=
n
> implementation were to use a simple linear approach, O(n) multiplications=
]).
>
But really O(lg n) multiplications, right?
That graph looks a lot better (flatter), but I'd still have to see the code
before I believe it. You say your data was

> gathered using "std::chrono::high_resolution_clock::now()" surrounding
for-loops executing the functions

which pointedly omits any reference to e.g. Google Benchmark
<https://github.com/google/benchmark> or ClobberMemory/DoNotOptimize. Which
suggests that your benchmark might not have been measuring anything
meaningful.

=E2=80=93Arthur

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0LeMK-uYS5WPMEMxKjfGAA6TFybpFJD_Yqh12wkOP4=
FcQ%40mail.gmail.com.

--0000000000009dc516057fca2a16
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr">On Fri, Jan 18, 2019 at 8:12 PM &lt;<a hr=
ef=3D"mailto:joel.g.hemphill@gmail.com">joel.g.hemphill@gmail.com</a>&gt; w=
rote:<br></div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote"=
 style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:=
solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"=
>The case you pointed out of using the double-type of the return for &#39;p=
ow(int, int)&#39; would be a major concern. Perhaps a workaround would be t=
he requirement of an explicit template? i.e. &quot;double x =3D std::pow(10=
, 20);&quot; would use overload 7, whereas &quot;std::pow&lt;int, int&gt;(1=
0, 20)&quot; would return int? Alternatively, as Jake Arkinstall suggested,=
 a new syntax for &#39;pow&#39; as &#39;power&#39; might be in order, in wh=
ich case, such contingencies wouldn&#39;t be as large a concern. I would al=
so argue that the above code segment is poor practice, as it is relying upo=
n the pow function to convert the two integers to doubles. More explicit ty=
ping would be preferred in most coding environments. Another solution, as i=
s implemented with powl and powf, is to use a single-letter abbreviation to=
 explicitly define the types used. i.e. powi.<div><br></div><div>As for the=
 graph; I mentioned in a reply to my original posting that I have since fou=
nd an issue with the testing method I used for graphing the execution times=
 for pow and powi. I have since done other tests as shown below [avg. of 20=
000 runs for powi, and 500 for pow (since the execution is longer, I decide=
d to neglect the sample-count somewhat)]:</div><div><br></div><p class=3D"g=
mail-m_1293241612643520167separator" style=3D"text-align:left;clear:both"><=
img src=3D"cid:48451991-147f-4022-b5a2-fd68fb1a3cbe" alt=3D"Untitled2.png" =
width=3D"320" height=3D"183" style=3D"margin-left: 1em; margin-right: 1em;"=
></p><p class=3D"gmail-m_1293241612643520167separator" style=3D"text-align:=
left;clear:both">As you can see, powi does experience a gradual increase in=
 execution length with the increasing exponents (since it needs to do at wo=
rst [if an implementation were to use a simple linear approach, O(n) multip=
lications]).<br></p></div></blockquote><div>But really O(lg n) multiplicati=
ons, right?</div><div>That graph looks a lot better (flatter), but I&#39;d =
still have to see the code before I believe it. You say your data was</div>=
<div><br></div><div>&gt; gathered using &quot;std::chrono::high_resolution_=
clock::now()&quot; surrounding for-loops executing the functions</div><div>=
<br></div><div>which pointedly omits any reference to e.g. <a href=3D"https=
://github.com/google/benchmark">Google Benchmark</a> or ClobberMemory/DoNot=
Optimize. Which suggests that your benchmark might not have been measuring =
anything meaningful.</div><div><br></div><div>=E2=80=93Arthur</div></div></=
div>

<p></p>

-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0LeMK-uYS5WPMEMxKjfGAA6TFybpFJD=
_Yqh12wkOP4FcQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0LeMK-uYS5W=
PMEMxKjfGAA6TFybpFJD_Yqh12wkOP4FcQ%40mail.gmail.com</a>.<br />

--0000000000009dc516057fca2a16--
--0000000000009dc518057fca2a17
Content-Type: image/png; name="Untitled2.png"
Content-Disposition: inline; filename="Untitled2.png"
Content-Transfer-Encoding: base64
Content-ID: <48451991-147f-4022-b5a2-fd68fb1a3cbe>
X-Attachment-Id: 48451991-147f-4022-b5a2-fd68fb1a3cbe

iVBORw0KGgoAAAANSUhEUgAAAfUAAAEfCAIAAADX9ciiAAAYyklEQVR42u3dXY8kV3nAcX8UfwWu
fJcrbgJSRHJBGAVF5gKhCHEDGgSy0MoRG0HA0eBIK4LIIuMQRzAQIDFaI8cKlm2W8Rteg9fGlrN4
gWSJvYbFXu+yMZtnpnqqq+utq6uqX6r691fJ7u2pl1Onu/7nqXNO13PLhQsXXgAAjItw+y3xv5sA
gHERbud3AOB3AAC/AwD4HQDA7wAAfgcAfgcA8DsAgN8BAPwOAOB3AAC/AwC/AwD4HQDA78CquLi/
u7Ozu39RTYDf+X143jm7tzPLZtmsULydnb2z4/L70TFytV9y2jOnf/j31X5QM6XU5PE7Nsc7NTrI
/SkRyyoV2sDvqyvOyr2Z+yDjn/nDl9bAasuZuD1ThsM3Oh1+9e0T+J3fV2/U7fZ7g9Nbu9+Pvms9
fwT8zu9o7vfjgGp6X3/8x9n76qIqClda2a5Lti60MHkP5bWQ7XIornZ8lEbRa/lfZs6kukKqylNa
UYWzrKiNRkesOon69Rb3e8kWM29lz2G+t+uboPpPoexY1V/I6rqd7DSzQvLXtK61Ffw+dr9nLor8
DXXr+D3nn+zfckWIP+3u7uZ6etJ/Vm9YJfYe/D6nQqb/jH9NXudrY7asNbUx94h1fqxdr0X8Xlo1
Wb2WnHnLO4zaT6H6WMXy19btscczn1Lh35vTp8jvWIbf89H07NXSyO+Jlcqvz/zqM3896jje35t1
YdV+sv+ePWK/fq+qkOoehzq/19fGvI9gruKraqFN/0yuqNm1F+0ZmbN+7adQvW1pPVfXbf4o+dse
guf38fs931tQFy6VdlPkHFPWyV8lvLN7k76JkkC4ePHmW4k5oWhpARv4vaJCag5Z4/dFamNOK1L1
gTbvoZpn6XzbW7ixaaz4Ln6vPlZZL05N3c7r+1vGEAH4fSR+r/hT6VWTv36T1xOxH75xtEGZUso9
3cTvbeP3Or+X22Ce32tqo5vfs61ZScfFwuOrudMt2WXD/vcu/TPVxyrze8058ju/8/tS/F4TVU03
Tqf1TV7MKqX26luX3zcsfq8+35bzZ9KPoHou46TdrS/iop9PRclyxxK/8zvW7Pd5vaLpP89OZ22f
PeqCP7vXuCe6td9Lr/FGfp/TaHTpf+/q95LaaDs/cuL1+qnqTXrjayP4+k+h8lgd+9/5nd/5vWYy
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
NRpJA0xVBAAAAABJRU5ErkJggg==
--0000000000009dc518057fca2a17--

.
