From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr 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 3C0897F8BC for ; Fri, 25 Apr 2014 12:23:22 +0200 (CEST) Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of jdimino@janestreet.com) identity=pra; client-ip=38.105.200.229; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="jdimino@janestreet.com"; x-sender="jdimino@janestreet.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of jdimino@janestreet.com designates 38.105.200.229 as permitted sender) identity=mailfrom; client-ip=38.105.200.229; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="jdimino@janestreet.com"; x-sender="jdimino@janestreet.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@mxout3.mail.janestreet.com) identity=helo; client-ip=38.105.200.229; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="jdimino@janestreet.com"; x-sender="postmaster@mxout3.mail.janestreet.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApgBAOw2WlMmacjlnGdsb2JhbABZg1VXrQ2OGYh6gQoeDgEBAQEBBhYJPIJTGQEBOCVdEgEFASIBiFMDAgiacYsahFQBBZ9sEQaOFz6ERJkJgTiLUoNhGCmEYoFq X-IPAS-Result: ApgBAOw2WlMmacjlnGdsb2JhbABZg1VXrQ2OGYh6gQoeDgEBAQEBBhYJPIJTGQEBOCVdEgEFASIBiFMDAgiacYsahFQBBZ9sEQaOFz6ERJkJgTiLUoNhGCmEYoFq X-IronPort-AV: E=Sophos;i="4.97,926,1389740400"; d="scan'208";a="70251306" Received: from mx5.janestreet.com (HELO mxout3.mail.janestreet.com) ([38.105.200.229]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-SHA; 25 Apr 2014 12:23:20 +0200 Received: from tot-oib-smtp1.delacy.com ([172.27.22.15] helo=tot-smtp) by mxout3.mail.janestreet.com with esmtp (Exim 4.76) (envelope-from ) id 1WddHq-0001US-6w for caml-list@inria.fr; Fri, 25 Apr 2014 06:23:18 -0400 Received: from tot-dmz-mxgoog1.delacy.com ([172.27.224.14] helo=mxgoog2.janestreet.com) by tot-smtp with esmtps (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1WddHq-00022x-5H for caml-list@inria.fr; Fri, 25 Apr 2014 06:23:18 -0400 Received: from mail-ie0-f177.google.com ([209.85.223.177]) by mxgoog2.janestreet.com with esmtp (Exim 4.76) (envelope-from ) id 1WddHq-0007S0-1L for caml-list@inria.fr; Fri, 25 Apr 2014 06:23:18 -0400 Received: by mail-ie0-f177.google.com with SMTP id rl12so3609837iec.36 for ; Fri, 25 Apr 2014 03:23:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com; s=google; h=mime-version:date:message-id:subject:from:to:content-type; bh=tF23YmIa2ROoRhjLuZkAO9dZuBMvB8SroVX7zTapQUo=; b=FGbSdGNmvLmWHwvLwJm2Ndjqf8Q8AbHl5VKLJkmFTTzQYkk4tdYSTKXsJJgNjOwkNf Gj2i3VwIzM8bzP/qldTLUEv4MDyDbaolqDnnWc3jwTz5O/sp/nOOTegMcmGvdj+LPTRa eWh04y4jnTmyIliCsVCO0pWXNALCk+xH1xgbU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=tF23YmIa2ROoRhjLuZkAO9dZuBMvB8SroVX7zTapQUo=; b=bHtxOWMbkr3Mkjej4VONgZMRdSl5UXzlVzShtCmEdV8mLcW4Qy6BRkqaZ0XfC6NvaB WbiTxHbkKpLcfYHQx+ABSkhO3criPUun2KQzqS3fjHauhAufsfGyWYkxdQ1dxG5IhbPm c+S2Q9D0Q/iTR+Sv0BTAk/NXi0h/K06X8CDsGoePZUaMlYVFX05jW3cRJzaiP/DLSagF iB6B0xrD9Rr+iTqr0vD5u9XP+z1O7z0cdcXBsE7QnFUjb5pZfpjdhhoqRco+1vUb5jR+ +fhaNB8WLxrO8dtB1w+UuYF1Y/pOcNX9AGFJ2lrMgbxvaga3vgeAwht2ItPX20vZMNei v7nQ== X-Gm-Message-State: ALoCoQmtJoBHrDY/9HyCyQo+VBDZ/P05cdV/hxd4tuf/E4cstIEuXXilgSZLcVXnFjc3aTTqdGxYhen1cwRx119bzA56uUSHKQnlp1Xd2tOhaR2f5SSlPwmeXbEHoUO7+Tp7Gr3NmVtF X-Received: by 10.50.79.227 with SMTP id m3mr3828854igx.47.1398421397727; Fri, 25 Apr 2014 03:23:17 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.50.79.227 with SMTP id m3mr3828844igx.47.1398421397595; Fri, 25 Apr 2014 03:23:17 -0700 (PDT) Received: by 10.50.117.40 with HTTP; Fri, 25 Apr 2014 03:23:17 -0700 (PDT) Date: Fri, 25 Apr 2014 11:23:17 +0100 Message-ID: From: Jeremie Dimino To: ocaml-core@googlegroups.com, "caml-list@inria.fr" Content-Type: multipart/alternative; boundary=089e01175f5da681fb04f7db5a68 Subject: [Caml-list] [ANN] Core Suite 111.11.00 --089e01175f5da681fb04f7db5a68 Content-Type: text/plain; charset=ISO-8859-1 I am pleased to announce the 111.11.00 release of the Core suite. The following packages were upgraded: - async - async_extra - async_kernel - async_unix - core - core_extended - core_kernel - ocaml_plugin - sexplib Files and documentation for this release are available on our website and all packages are in opam: https://ocaml.janestreet.com/ocaml-core/111.11.00/individual/ https://ocaml.janestreet.com/ocaml-core/111.11.00/doc/ Here is the changelog for this version: # 111.11.00 ## async - Updated the sound.ml example ## async_extra - Made `Log` more fair with respect to other Async jobs, by working on fixed-length groups of incoming log messages. Previously, `Log` had processed everything available. The change gives other Async jobs more of a chance to run. ## async_kernel - Added `Clock.run_at_intervals`, which runs a job at regular intervals. ## async_unix - Added `val Scheduler.yield : unit -> unit Deferred.t`, which becomes determined after the current cycle finishes. - Improved the behavior of the scheduler's thread pool when `Thread.create` raises. With this improvement, when the thread pool is unable to create a thread, it presses on with the threads it has rather than raise. Subsequent attempts to add work to the thread pool will cause the pool to attempt to create the thread, as long as enough time has passed since the most recent thread-creation failure. Before this change, the thread pool wouldn't handle a `Thread.create` exception, and the exception would get raised to whatever code happened to be calling the `Thread_pool` function that tried to create a thread, e.g. `Thread_pool.add_work`. This caused `In_thread.run` to unexpectedly raise, and in turn `In_thread.syscall` to unexpectedly raise, leading to: ``` "Fd.syscall_in_thread bug -- should be impossible" ``` Also, changed `should be impossible` text to `please report`, since there may be other lurking rare exceptions that `In_thread.syscall` can raise, and we'd like to hear about them. We rely on thread-pool-stuck detection to report problems where the inability to create threads causes the inability of the thread pool to make progress. A tweak was needed to make that work -- now the thread-pool-stuck warning is based on whether the thread pool has unstarted work, rather than on whether the thread pool has an "available thread". The latter would no longer work, since it is now possible for the thread pool to have unstarted work and to appear to have an available thread, i.e. `num_threads < max_num_threads`. ## core - Change some `Bigstring` functions to retry on `EINTR` rather than raise. The following functions (and their unsafe versions) were affected: * `read` * `really_read` * `really_recv` * `really_write` * `really_send_no_sigpipe` Some other `Bigstring` functions, like `input` and `output`, already retried on `EINTR`, so this change has precedent. All of the affected stubs raise `Bigstring.IOError` on failure, rather than `Unix_error`, which means the normal method for retrying on `EINTR` doesn't work. In particular `Async.Reader` didn't retry them, even though it was supposed to. Additionally, the documentation for the following functions was corrected to say that they raise =Unix_error= rather than =IOError=: * `pread_assume_fd_is_nonblocking` * `pwrite_assume_fd_is_nonblocking` - Eliminated global binary-to-decimal tables computed at startup for converting `Date` and `Of_day` to string. Used an efficient implementation of division by 10, rather than the `sprintf` tables in `time_internal.ml`. This result in much less allocation at startup and it is a bit faster: * before: | Name | Time/Run | mWd/Run | Percentage | |----------------|----------|---------|------------| | Date.to_string | 69.39ns | 3.00w | 100.00% | - after: | Name | Time/Run | mWd/Run | Percentage | |----------------|----------|---------|------------| | Date.to_string | 53.38ns | 3.00w | 100.00% | - Fixed `Time.Zone` tests so that they are deterministic. - Added `Iobuf.to_string_hum`, which produces a readable, multi-line representation of an iobuf, intended for debugging. - Fixed brittle unit tests of `Command`. ## core_extended - For `Flang`, added ordering to fields, and added `abs`, `min`, and `max` to the language. - Removed `Loggers` module. ## core_kernel - Added to `String` functions for substring search and replace, based on the KMP algorithm. Here are some benchmarks, comparing `Re2` for a fixed pattern, Mark's kmp from extended_string, and this implementation ("needle"). The pattern is the usual `abacabadabacabae...`. The text looks similar, with the pattern occurring at the very end. For =Re2= and =Needle= search benchmarks, the pattern is preprocessed in advance, outside of the benchmark. FWIW: I've also tried searches with pattern size = 32767, but =Re2= blows up, saying: ``` re2/dfa.cc:447: DFA out of memory: prog size 32771 mem 2664898 ``` | Name | Time/Run | mWd/Run | mjWd/Run | Prom/Run | Percentage | |-------------------------------|-----------------|---------------|-------------|----------|------------| | create_needle_15 | 102.56ns | 21.00w | | | | | re2_compile_15 | 6_261.48ns | | 3.00w | | 0.01% | | create_needle_1023 | 13_870.48ns | 5.00w | 1_024.01w | | 0.03% | | re2_compile_1023 | 107_533.32ns | | 3.03w | | 0.24% | | create_needle_8191 | 90_107.02ns | 5.00w | 8_192.01w | | 0.20% | | re2_compile_8191 | 1_059_873.47ns | | 3.28w | 0.28w | 2.37% | | create_needle_524287 | 6_430_623.96ns | 5.00w | 524_288.09w | | 14.35% | | re2_compile_524287 | 44_799_605.83ns | | 3.77w | 0.77w | 100.00% | | needle_search_15_95 | 349.65ns | 4.00w | | | | | re2_search_15_95 | 483.11ns | | | | | | mshinwell_search_15_95 | 1_151.38ns | 781.01w | | | | | needle_search_15_815 | 2_838.85ns | 4.00w | | | | | re2_search_15_815 | 3_293.06ns | | | | | | mshinwell_search_15_815 | 8_360.57ns | 5_821.07w | 0.55w | 0.55w | 0.02% | | needle_search_15_2415 | 8_395.84ns | 4.00w | | | 0.02% | | re2_search_15_2415 | 9_594.14ns | | | | 0.02% | | mshinwell_search_15_2415 | 24_602.09ns | 17_021.16w | 1.62w | 1.62w | 0.05% | | needle_search_1023_6143 | 14_825.50ns | 4.00w | | | 0.03% | | re2_search_1023_6143 | 40_926.59ns | | | | 0.09% | | mshinwell_search_1023_6143 | 81_930.46ns | 49_149.66w | 1_025.65w | 1.65w | 0.18% | | needle_search_1023_52223 | 126_465.96ns | 4.00w | | | 0.28% | | re2_search_1023_52223 | 365_359.98ns | | | | 0.82% | | mshinwell_search_1023_52223 | 527_323.73ns | 371_715.39w | 1_033.17w | 9.17w | 1.18% | | needle_search_1023_154623 | 377_539.53ns | 4.00w | | | 0.84% | | re2_search_1023_154623 | 1_001_251.93ns | | | | 2.23% | | mshinwell_search_1023_154623 | 1_499_835.01ns | 1_088_518.15w | 1_033.19w | 9.19w | 3.35% | | needle_search_8191_49151 | 115_223.31ns | 4.00w | | | 0.26% | | re2_search_8191_49151 | 559_487.38ns | | | | 1.25% | | mshinwell_search_8191_49151 | 653_981.19ns | 393_219.50w | 8_201.01w | 9.01w | 1.46% | | needle_search_8191_417791 | 976_725.24ns | 4.00w | | | 2.18% | | re2_search_8191_417791 | 4_713_965.69ns | | | | 10.52% | | mshinwell_search_8191_417791 | 4_224_417.93ns | 2_973_709.32w | 8_202.37w | 10.37w | 9.43% | | needle_search_8191_1236991 | 2_912_863.78ns | 4.00w | | | 6.50% | | re2_search_8191_1236991 | 14_039_230.59ns | | | | 31.34% | | mshinwell_search_8191_1236991 | 11_997_713.73ns | 8_708_130.87w | 8_202.47w | 10.47w | 26.78% | - Added to `Set` functions for converting to and from a `Map.t`. ```ocaml val to_map : ('key, 'cmp) t -> f:('key -> 'data) -> ('key, 'data, 'cmp) Map.t val of_map_keys : ('key, _, 'cmp) Map.t -> ('key, 'cmp) t ``` This required adding some additional type trickery to `Core_set_intf` to indicate that the comparator for a given module may or may not be fixed. - Added an optional `iter` parameter to `Container.Make`. A direct implementation of `iter` is often more efficient than defining `iter` in terms of `fold`, and in these cases, the results of `Container.Make` that are defined in terms of `iter` will be more efficient also. - Added `Int.pow` (and for other integer types), for bounds-checked integer exponentiation. ## ocaml_plugin - Added a tag to exceptions coming from the toplevel execution of plugins so that we do not confuse them with exceptions coming from the library. Also, added a function to check a plugin without executing it. And captured the common pattern of checking the compilation of a plugin in a `Command.t` offered in the library. ## sexplib - Added error locations to `Macro`-expansion errors. -- Jeremie Dimino, for the Core team --089e01175f5da681fb04f7db5a68 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
I am pleased to announce the 111.11.00 release of the= Core suite.

The following packages were upgraded:=

- async
- async_extra
- async= _kernel
- async_unix
- core
- core_extended
- co= re_kernel
- ocaml_plugin
- sexplib

=
Files and documentation for this release are available on our website<= /div>
and all packages are in opam:


Here is the changelog for this version:

<= /div>
# 111.11.00

## async

- Updated the sound.ml example

## async_extra

- Made `Log` mo= re fair with respect to other Async jobs, by working on
=A0 fixed= -length groups of incoming log messages.

=A0 Previ= ously, `Log` had processed everything available. =A0The change
=A0 gives other Async jobs more of a chance to run.

## async_kernel

- Added `Clock.run_at_inter= vals`, which runs a job at regular
=A0 intervals.

<= /div>
## async_unix

- Added `val Scheduler.yield : = unit -> unit Deferred.t`, which becomes
=A0 determined after t= he current cycle finishes.
- Improved the behavior of the schedul= er's thread pool when
=A0 `Thread.create` raises.

=A0 With this imp= rovement, when the thread pool is unable to create a
=A0 thread, = it presses on with the threads it has rather than raise.
=A0 Subs= equent attempts to add work to the thread pool will cause the
=A0 pool to attempt to create the thread, as long as enough time has
=A0 passed since the most recent thread-creation failure.

=A0 Before this change, the thread pool wouldn't handl= e a
=A0 `Thread.create` exception, and the exception would get raised to
=A0 whatever code happened to be calling the `Thread_pool` functio= n that
=A0 tried to create a thread, e.g. `Thread_pool.add_work`.= =A0This caused
=A0 `In_thread.run` to unexpectedly raise, and in turn
=A0 `= In_thread.syscall` to unexpectedly raise, leading to:

<= div>=A0 ```
=A0 "Fd.syscall_in_thread bug -- should be impos= sible"
=A0 ```

=A0 Also, changed `should be impossib= le` text to `please report`, since
=A0 there may be other lurking= rare exceptions that `In_thread.syscall`
=A0 can raise, and we&#= 39;d like to hear about them.

=A0 We rely on thread-pool-stuck detection to report pr= oblems where the
=A0 inability to create threads causes the inabi= lity of the thread pool
=A0 to make progress. =A0A tweak was need= ed to make that work -- now the
=A0 thread-pool-stuck warning is based on whether the thread pool has<= /div>
=A0 unstarted work, rather than on whether the thread pool has an=
=A0 "available thread". =A0The latter would no longer = work, since it is
=A0 now possible for the thread pool to have unstarted work and to
=A0 appear to have an available thread, i.e. `num_threads <
=
=A0 max_num_threads`.

## core

<= /div>
- Change some `Bigstring` functions to retry on `EINTR` rather than
=A0 raise.

=A0 The following functions (an= d their unsafe versions) were affected:

=A0 * `rea= d`
=A0 * `really_read`
=A0 * `really_recv`
=A0 * `rea= lly_write`
=A0 * `really_send_no_sigpipe`

=A0 Some other `Bigstring` functions, like `input` and `output`, already<= /div>
=A0 retried on `EINTR`, so this change has precedent.

<= div>=A0 All of the affected stubs raise `Bigstring.IOError` on failure,
=A0 rather than `Unix_error`, which means the normal method for retr= ying
=A0 on `EINTR` doesn't work. =A0In particular `Async.Reader` didn&= #39;t retry
=A0 them, even though it was supposed to.
<= br>
=A0 Additionally, the documentation for the following functio= ns was
=A0 corrected to say that they raise =3DUnix_error=3D rather than =3DI= OError=3D:

=A0 * `pread_assume_fd_is_nonblocking`<= /div>
=A0 * `pwrite_assume_fd_is_nonblocking`
- Eliminated gl= obal binary-to-decimal tables computed at startup for
=A0 converting `Date` and `Of_day` to string.

=A0 Used an efficient implementation of division by 10, rather than the
=A0 `sprintf` tables in `time_i= nternal.ml`. =A0This result in much less
=A0 allocation at startup and it is a bit faster:

=
=A0 * before:

=A0 | Name =A0 =A0 =A0 =A0 =A0 = | Time/Run | mWd/Run | Percentage |
=A0 |----------------|-------= ---|---------|------------|
=A0 | Date.to_string | =A069.39ns | =A0 3.00w | =A0 =A0100.00% |
=

=A0 - after:

=A0 | Name =A0 = =A0 =A0 =A0 =A0 | Time/Run | mWd/Run | Percentage |
=A0 |--------= --------|----------|---------|------------|
=A0 | Date.to_string | =A053.38ns | =A0 3.00w | =A0 =A0100.00% |
=
- Fixed `Time.Zone` tests so that they are deterministic.
- = Added `Iobuf.to_string_hum`, which produces a readable, multi-line
=A0 representation of an iobuf, intended for debugging.
- Fixed brittle unit tests of `Command`.

## c= ore_extended

- For `Flang`, added ordering to fiel= ds, and added `abs`, `min`, and
=A0 `max` to the language.
- Removed `Loggers` module.

## core_kernel

- Added to `String` functions for substring search a= nd replace, based
=A0 on the KMP algorithm.

=A0 Here are some benchmarks, comparing `Re2` for a fixed pattern,
=A0 Mark's kmp from extended_string, and this implementation (&q= uot;needle").

=A0 The pattern is the usual `a= bacabadabacabae...`. =A0The text looks
=A0 similar, with the pattern occurring at the very end.
=A0 For =3DRe2=3D and =3DNeedle=3D search benchmarks, the patte= rn is
=A0 preprocessed in advance, outside of the benchmark.

=A0 FWIW: I've also tried searches with pattern size =3D 327= 67, but =3DRe2=3D
=A0 blows up, saying:

= =A0 ```
=A0 re2/dfa.cc:447: DFA out of memory: prog size 32771 me= m 2664898
=A0 ```

=A0 | Name =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A0 =A0Time/Run | =A0 =A0 =A0 mWd/Run = | =A0 =A0mjWd/Run | Prom/Run | Percentage |
=A0 |----------------= ---------------|-----------------|---------------|-------------|----------|= ------------|
=A0 | create_needle_15 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A0 =A0102= .56ns | =A0 =A0 =A0 =A021.00w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 = =A0| =A0 =A0 =A0 =A0 =A0 =A0|
=A0 | re2_compile_15 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A06_261.48ns | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | = =A0 =A0 =A0 3.00w | =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A00.01% |
=A0 | create_needle_1023 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =A0 13_870.48ns = | =A0 =A0 =A0 =A0 5.00w | =A0 1_024.01w | =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A00= .03% |
=A0 | re2_compile_1023 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 = =A0107_533.32ns | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 3.03w | =A0 =A0= =A0 =A0 =A0| =A0 =A0 =A00.24% |
=A0 | create_needle_8191 =A0 =A0 =A0 =A0 =A0 =A0| =A0 =A0 90_107.02ns = | =A0 =A0 =A0 =A0 5.00w | =A0 8_192.01w | =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A00= .20% |
=A0 | re2_compile_8191 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A01_0= 59_873.47ns | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 3.28w | =A0 =A00.28= w | =A0 =A0 =A02.37% |
=A0 | create_needle_524287 =A0 =A0 =A0 =A0 =A0| =A06_430_623.96ns | = =A0 =A0 =A0 =A0 5.00w | 524_288.09w | =A0 =A0 =A0 =A0 =A0| =A0 =A0 14.35% |=
=A0 | re2_compile_524287 =A0 =A0 =A0 =A0 =A0 =A0| 44_799_605.83n= s | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 3.77w | =A0 =A00.77w | =A0 = =A0100.00% |
=A0 | needle_search_15_95 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0349.65n= s | =A0 =A0 =A0 =A0 4.00w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| = =A0 =A0 =A0 =A0 =A0 =A0|
=A0 | re2_search_15_95 =A0 =A0 =A0 =A0 = =A0 =A0 =A0| =A0 =A0 =A0 =A0483.11ns | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 = =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A0 =A0 =A0 =A0|
=A0 | mshinwell_search_15_95 =A0 =A0 =A0 =A0| =A0 =A0 =A01_151.38ns | = =A0 =A0 =A0 781.01w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| =A0 = =A0 =A0 =A0 =A0 =A0|
=A0 | needle_search_15_815 =A0 =A0 =A0 =A0 = =A0| =A0 =A0 =A02_838.85ns | =A0 =A0 =A0 =A0 4.00w | =A0 =A0 =A0 =A0 =A0 = =A0 | =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A0 =A0 =A0 =A0|
=A0 | re2_search_15_815 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A03_293.06n= s | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0= =A0| =A0 =A0 =A0 =A0 =A0 =A0|
=A0 | mshinwell_search_15_815 =A0 = =A0 =A0 | =A0 =A0 =A08_360.57ns | =A0 =A0 5_821.07w | =A0 =A0 =A0 0.55w | = =A0 =A00.55w | =A0 =A0 =A00.02% |
=A0 | needle_search_15_2415 =A0 =A0 =A0 =A0 | =A0 =A0 =A08_395.84ns | = =A0 =A0 =A0 =A0 4.00w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| =A0 = =A0 =A00.02% |
=A0 | re2_search_15_2415 =A0 =A0 =A0 =A0 =A0 =A0| = =A0 =A0 =A09_594.14ns | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0 = =A0 | =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A00.02% |
=A0 | mshinwell_search_15_2415 =A0 =A0 =A0| =A0 =A0 24_602.09ns | =A0 = =A017_021.16w | =A0 =A0 =A0 1.62w | =A0 =A01.62w | =A0 =A0 =A00.05% |
=
=A0 | needle_search_1023_6143 =A0 =A0 =A0 | =A0 =A0 14_825.50ns | =A0 = =A0 =A0 =A0 4.00w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| =A0 =A0 = =A00.03% |
=A0 | re2_search_1023_6143 =A0 =A0 =A0 =A0 =A0| =A0 =A0 40_926.59ns | = =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0= | =A0 =A0 =A00.09% |
=A0 | mshinwell_search_1023_6143 =A0 =A0| = =A0 =A0 81_930.46ns | =A0 =A049_149.66w | =A0 1_025.65w | =A0 =A01.65w | = =A0 =A0 =A00.18% |
=A0 | needle_search_1023_52223 =A0 =A0 =A0| =A0 =A0126_465.96ns | =A0 = =A0 =A0 =A0 4.00w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| =A0 =A0 = =A00.28% |
=A0 | re2_search_1023_52223 =A0 =A0 =A0 =A0 | =A0 =A03= 65_359.98ns | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 = =A0 =A0 =A0 =A0| =A0 =A0 =A00.82% |
=A0 | mshinwell_search_1023_52223 =A0 | =A0 =A0527_323.73ns | =A0 371_= 715.39w | =A0 1_033.17w | =A0 =A09.17w | =A0 =A0 =A01.18% |
=A0 |= needle_search_1023_154623 =A0 =A0 | =A0 =A0377_539.53ns | =A0 =A0 =A0 =A0 = 4.00w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A00.84% |
=A0 | re2_search_1023_154623 =A0 =A0 =A0 =A0| =A01_001_251.93ns | =A0 = =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| = =A0 =A0 =A02.23% |
=A0 | mshinwell_search_1023_154623 =A0| =A01_4= 99_835.01ns | 1_088_518.15w | =A0 1_033.19w | =A0 =A09.19w | =A0 =A0 =A03.3= 5% |
=A0 | needle_search_8191_49151 =A0 =A0 =A0| =A0 =A0115_223.31ns | =A0 = =A0 =A0 =A0 4.00w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| =A0 =A0 = =A00.26% |
=A0 | re2_search_8191_49151 =A0 =A0 =A0 =A0 | =A0 =A05= 59_487.38ns | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 = =A0 =A0 =A0 =A0| =A0 =A0 =A01.25% |
=A0 | mshinwell_search_8191_49151 =A0 | =A0 =A0653_981.19ns | =A0 393_= 219.50w | =A0 8_201.01w | =A0 =A09.01w | =A0 =A0 =A01.46% |
=A0 |= needle_search_8191_417791 =A0 =A0 | =A0 =A0976_725.24ns | =A0 =A0 =A0 =A0 = 4.00w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A02.18% |
=A0 | re2_search_8191_417791 =A0 =A0 =A0 =A0| =A04_713_965.69ns | =A0 = =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| = =A0 =A0 10.52% |
=A0 | mshinwell_search_8191_417791 =A0| =A04_224= _417.93ns | 2_973_709.32w | =A0 8_202.37w | =A0 10.37w | =A0 =A0 =A09.43% |=
=A0 | needle_search_8191_1236991 =A0 =A0| =A02_912_863.78ns | =A0 =A0 = =A0 =A0 4.00w | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0| =A0 =A0 =A06= .50% |
=A0 | re2_search_8191_1236991 =A0 =A0 =A0 | 14_039_230.59n= s | =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0 =A0 =A0 | =A0 =A0 =A0 =A0= =A0| =A0 =A0 31.34% |
=A0 | mshinwell_search_8191_1236991 | 11_997_713.73ns | 8_708_130.87w = | =A0 8_202.47w | =A0 10.47w | =A0 =A0 26.78% |
- Added to `Set` = functions for converting to and from a `Map.t`.

= =A0 ```ocaml
=A0 val to_map : ('key, 'cmp) t -> f:('key -> 'd= ata) -> ('key, 'data, 'cmp) Map.t
=A0 val of_map_k= eys : ('key, _, 'cmp) Map.t -> ('key, 'cmp) t
=A0 ```

=A0 This required adding some additional t= ype trickery to
=A0 `Core_set_intf` to indicate that the comparat= or for a given module
=A0 may or may not be fixed.
- Ad= ded an optional `iter` parameter to `Container.Make`.

=A0 A direct implementation of `iter` is often more eff= icient than
=A0 defining `iter` in terms of `fold`, and in these = cases, the results
=A0 of `Container.Make` that are defined in te= rms of `iter` will be more
=A0 efficient also.
- Added `Int.pow` (and for other integer= types), for bounds-checked
=A0 integer exponentiation.

## ocaml_plugin

- Added a tag to e= xceptions coming from the toplevel execution of
=A0 plugins so that we do not confuse them with exceptions coming from=
=A0 the library.

=A0 Also, added a func= tion to check a plugin without executing it. =A0And
=A0 captured = the common pattern of checking the compilation of a plugin
=A0 in a `Command.t` offered in the library.

= ## sexplib

- Added error locations to `Macro`-expa= nsion errors.

--=A0
Jeremie Dimino, for = the Core team
--089e01175f5da681fb04f7db5a68--