From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6B31E80198 for ; Mon, 10 Jul 2017 22:26:23 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=alex.only.d@gmail.com; spf=Pass smtp.mailfrom=alex.only.d@gmail.com; spf=None smtp.helo=postmaster@mail-yb0-f176.google.com Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of alex.only.d@gmail.com) identity=pra; client-ip=209.85.213.176; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="alex.only.d@gmail.com"; x-sender="alex.only.d@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alex.only.d@gmail.com designates 209.85.213.176 as permitted sender) identity=mailfrom; client-ip=209.85.213.176; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="alex.only.d@gmail.com"; x-sender="alex.only.d@gmail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-yb0-f176.google.com) identity=helo; client-ip=209.85.213.176; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="alex.only.d@gmail.com"; x-sender="postmaster@mail-yb0-f176.google.com"; x-conformance=sidf_compatible IronPort-PHdr: =?us-ascii?q?9a23=3AXkcqmBeHEVMYtoW9gidHwEtRlGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxcuyYR7h7PlgxGXEQZ/co6odzbGH7Oa4ASQp2tWoiDg6aptCVhsI24?= =?us-ascii?q?09vjcLJ4q7M3D9N+PgdCcgHc5PBxdP9nC/NlVJSo6lPwWB6nK94iQPFRrhKAF7?= =?us-ascii?q?Ovr6GpLIj8Swyuu+54Dfbx9GiTe5Y75+Ngm6oRnMvcQKnIVuLbo8xAHUqXVSYe?= =?us-ascii?q?RWwm1oJVOXnxni48q74YBu/SdNtf8/7sBMSar1cbg2QrxeFzQmLns65Nb3uhnZ?= =?us-ascii?q?TAuA/WUTX2MLmRdVGQfF7RX6XpDssivms+d2xSeXMdHqQb0yRD+v6bpgRh31hy?= =?us-ascii?q?cdLzM38G/ZhM9tgqxFvB2svAB/z5LObY2JKPZyYqHQcNUHTmRBRMZRUClBD5ug?= =?us-ascii?q?YosLEeUAMvhXrongrFUBohu+AhOsBOTxyjRVgXL5x6k63PouEA3c2wwgGdYOsX?= =?us-ascii?q?TOoNroL6oSXuW1w7PJzTXHdf9ZxTD96I3Rfx0nvPqCU7Vwcc/LxkkuEQPIllqQ?= =?us-ascii?q?qY35PzOVy+QCqHKX4PZnVeKqk2InpRlxrSSoxscpkonJgpwaykza+ilj3Ik1It?= =?us-ascii?q?i4RUhmatCnCJtdrz+WO5dyT884QGxluDw2xqMbtZO1ZiQG1ZYqyh/ZZveaaYaH?= =?us-ascii?q?+AjjW/yUITpghHJqZra/hxGq/Eil0OL8V8203E9KryVejtXAr34N2wHR58WGUP?= =?us-ascii?q?d98UCh2TGA1wDX9O5IO1w7la3eK5I5w74wkIQcsVjbEyPohEn7iLWae0Yk9+Sy?= =?us-ascii?q?9ejrf7vrqoWBO4J2iwzyKqEulda+AeQ8PAgORW+b+eGk2bL5+U32XrpLgucxkq?= =?us-ascii?q?nftJDbJd4XqbOiDg9a14Ys8Re/DzO83NsEmnkHKUpJeAibgIjxJ1HOPPf4AO+j?= =?us-ascii?q?jFu2lTdrw+nKPrngApXWMnjOi6zhfLZ4605E0gU/19Ff55ROCrEAOv3/QEHxtM?= =?us-ascii?q?aLRiM+Zge9xuKvFc5wzJhWDWmGB6vcNKLJrXeJ4PguKq+CftlGliz6Lq0M4/P+?= =?us-ascii?q?gG5xtFAaZ663lc8ebH2oWPNgJ1TfbVLjh94AFSEBuQ9oH7+is0GLTTMGPyX6ZK?= =?us-ascii?q?k7/DxuUI8=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0D7BgC/4WNZhrDVVdFdhC80C4EUB4Npm?= =?us-ascii?q?WEBcgEBBopHjnYOHokWB0MUAQEBAQEBAQEBAQESAQEBCAsLCCgvQg6BYyKCbR0?= =?us-ascii?q?BGx4DEhAPAiYCJAERAQUBIoopAQMIDRCbPYNFP4wKggQFARyDCAWDYwoZJw1Wg?= =?us-ascii?q?0wCBhJ5gh0vggRSjUmCYQWJYod1jUeBZoVijEKCY4EPjjCTeBQfgRU2gSsxISN?= =?us-ascii?q?4hQmBejk2BYEihz8BAQE?= X-IPAS-Result: =?us-ascii?q?A0D7BgC/4WNZhrDVVdFdhC80C4EUB4NpmWEBcgEBBopHjnY?= =?us-ascii?q?OHokWB0MUAQEBAQEBAQEBAQESAQEBCAsLCCgvQg6BYyKCbR0BGx4DEhAPAiYCJ?= =?us-ascii?q?AERAQUBIoopAQMIDRCbPYNFP4wKggQFARyDCAWDYwoZJw1Wg0wCBhJ5gh0vggR?= =?us-ascii?q?SjUmCYQWJYod1jUeBZoVijEKCY4EPjjCTeBQfgRU2gSsxISN4hQmBejk2BYEih?= =?us-ascii?q?z8BAQE?= X-IronPort-AV: E=Sophos;i="5.40,342,1496095200"; d="scan'208";a="282851858" Received: from mail-yb0-f176.google.com ([209.85.213.176]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/AES128-GCM-SHA256; 10 Jul 2017 22:26:22 +0200 Received: by mail-yb0-f176.google.com with SMTP id 84so31854177ybe.0 for ; Mon, 10 Jul 2017 13:26:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=D/9FAtVI8A5SDSxEFbOciTqwo4NI3S5sm1F1fMzlCsk=; b=mCbQ+Q9jwh5/mdR1SPk+aU6vItmlroweK1LVM4fvBFKZNpWe/XjbF8e64NQhauTMtM Kz8N/hwA0xxbaNszPG+El0KXZJw7v7/135g3yk1luy2a2QdY6HMzb4j77/oDomK/TEj4 Mhlh3+jO2z8F4DCz8pCTKMwrzHR3+5YQVXrcxjDHeJPlFiKLNMlC4YwZinMJUbztuWFU 4AgTcSxPbXiZQsMO269jRI0MXi3xxry0VmTXgT5yiEWafJIubPRm9oyBOyKfiBuUjLiX E6btWjpiTpafgUZRIzdEAw/NIw2YmaSu+Q2LPB2MSZVGgtHFuZPShJ5+IlfcL5f2Qxuz MZ9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=D/9FAtVI8A5SDSxEFbOciTqwo4NI3S5sm1F1fMzlCsk=; b=jtyEEE4SCTvMX5kuL4+PFFEuzL+qxsJLCJNQq8M8Mdh6fmQwt9MKyun///plcTHT7K gVZO/CPCPL3ODMftZhmhAFj4PrwFl/thGNOwSom5ynAxNweMFCYHnn0Ia5QlLkWyk0it pKMKPLhsrlN/fw7aAKef32OPgz+GroILHT28d//SF6ULSeiU5NAb+Tv3VEoZJ09yuujG V/YVWo+vdxo0z1gUdaHb47n5++5MoU0+h0f6Wb57NtIjMz0gOYjgzjqnUGEWQZ2gQhSS iWAXwjOkYMBoTXj9W2scLRK1gRFI5QDeMZD+aMGZKpuQiWK9Q+bG4K5qqgCYEGmlIM9p 6b5g== X-Gm-Message-State: AIVw110OrVCHn/cXEIkLBC4x1NXFQVaQ/fF7Gvd1BwOxTN/UfG39pDBB FcD5VhHy9F4kJj9X1+VxdSy23E+vhnij X-Received: by 10.37.164.162 with SMTP id g31mr16528507ybi.208.1499718381305; Mon, 10 Jul 2017 13:26:21 -0700 (PDT) MIME-Version: 1.0 Received: by 10.37.12.130 with HTTP; Mon, 10 Jul 2017 13:26:20 -0700 (PDT) From: Alexey Egorov Date: Tue, 11 Jul 2017 01:26:20 +0500 Message-ID: To: caml users Content-Type: text/plain; charset="UTF-8" Subject: [Caml-list] Optimizing pure-functional streams Hello, Michael Snoyman recently posted very interesting article about Haskell streams and Rust iterators ( https://www.fpcomplete.com/blog/2017/07/iterators-streams-rust-haskell ) and I tried to do the same in OCaml. You can find my code here - https://gist.github.com/anonymous/127e9116b362d561c5dfa9cce6b453f3 There is four different versions: 1) c_loop.c - plain C loop 2) f_loop.ml - for-loop in OCaml 3) loop.ml - OCaml loop using recursion 4) stream.ml - OCaml loop using streams Here is the results: c_loop.c: 0m0.105s f_loop.ml: 0m0.184s loop.ml: 0m0.207s stream.ml: 0m0.605s It's not suprise that C version is fastest - at least, it uses untagged ints. What surprises me is that recursion is slower than for-loop - can't OCaml compile it down to the same imperative loop? And it's very dissapointing that stream version is 3 times slower than recursion-based. The problem, I believe, is that OCaml is unable to optimize intermediate stream constructors away (as GHC do). I tried to add inline annotations, which helps a little - is there something I can do to improve it further?