timsort
Christopher Hegarty -Sun Microsystems Ireland
Christopher.Hegarty at Sun.COM
Tue Jul 7 14:35:20 UTC 2009
comments inline...
Martin Buchholz wrote:
> [+jjb] (Please keep Josh in this thread - he is the primary author)
>
>
> On Tue, Jul 7, 2009 at 02:51, Christopher Hegarty -Sun Microsystems
> Ireland <Christopher.Hegarty at sun.com
> <mailto:Christopher.Hegarty at sun.com>> wrote:
>
> Hi Martin,
>
> Sorry for joining the party late...
>
> I think adding the system property should take care of the
> compatibility issues, at least giving the user the ability to revert
> to the old behavior if they so choose.
>
> I have a few minor comments ( if these issue have been discussed
> already I apologize ):
>
> 1) Should we update the Arrays class description and appropriate sort
> methods to now refer to timsort instead of saying: "The sorting
> algorithm is a modified mergesort...". I know this is not strictly
> necessary, but you must have considered it already, right?
>
>
> Josh?
>
>
>
> 2) With the addition of @throws IllegalArgumentException, this
> condition cannot be met with the old merge sort right, i.e. running
> with -Djava.util.Arrays.useLegacyMergeSort=true. So we're saying
> that all bets are off when running with this property set?
>
>
> No. Please re-read the @throws IllegalArgumentException.
> It is carefully worded to make no promises at all. All bets are off -
> period.
OK great. But just to clarify, what exactly does "if the natural order
of the array elements is found to violate the Comparable contract" mean?
> No JCK tests can be written or are invalidated.
>
>
>
> 3) Have I missed something obvious! Can the test run, or even compile?
> Sorter.java, L29:
> ComparableTimSort.sort(array);
>
>
> These are not tests.
> Please see:
> http://cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/raw_files/new/test/java/util/TimSort/README
Yes, I only noticed that after sending the mail.
> One could rework the benchmarks to work with the newly introduced
> system property (using reflection to invoke appropriate methods)
> but I have no plans to do that.
>
>
>
> BTW, if you agree, I think we should stick with the process as is
> today for making spec changes. Once agreed, I can submit a CCC
> request for this change and help with the communication to get it
> approved.
>
>
> OK. Keep in mind that the spec changes are almost no-ops.
Once I understand the impact of the spec change then I hope the
fasttrack the CCC request.
-Chris.
>
> Martin
>
>
>
> -Chris.
>
>
>
>
>
> Martin Buchholz wrote:
>
> No one actually said NO, but both Alan and Andrew strongly
> hinted that
> a backward compatibility mode would be good.
> So I kept the old implementation and allow it to be selectable
> via a system property. There's nothing more compatible than
> the legacy implementation.
>
> /**
> * Old merge sort implementation can be selected (for
> * compatibility with broken comparators) using a system
> property.
> * Cannot be a static boolean in the enclosing class due to
> * circular dependencies. To be removed in a future release.
> */
> static final class LegacyMergeSort {
> private static final boolean userRequested =
> java.security.AccessController.doPrivileged(
> new sun.security.action.GetBooleanAction(
>
> "java.util.Arrays.useLegacyMergeSort")).booleanValue();
> }
>
> The sort method bodies now look like:
>
> if (LegacyMergeSort.userRequested)
> legacyMergeSort(a);
> else
> ComparableTimSort.sort(a);
>
> New webrev at:
> http://cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/
> <http://cr.openjdk.java.net/%7Emartin/webrevs/openjdk7/timsort/>
>
> If I don't hear from anyone soon (e.g. for CCC approval)
> I'll commit to the tl forest.
>
> Martin
>
> On Tue, Jun 30, 2009 at 11:28, Alan Bateman<Alan.Bateman at sun.com
> <mailto:Alan.Bateman at sun.com>> wrote:
>
> Martin Buchholz wrote:
>
> :
>
> As you suggested, I added the Classpath exception wording
> to TimSort.java and ComparableTimSort.java.
>
> I excised the old mergesort code from Arrays.java.
>
> webrev regenerated.
>
> Thanks for doing this.
>
> Adding all-or-nothing wording would be good to add,
> perhaps to the class-level javadoc. But it doesn't
> have to be part of this change.
>
> I brought it up because it looks like (and you can correct
> me) that the IAE
> may be thrown after some reordering of the array has taken
> place. This might
> be unexpected.
>
> The JDK project has unusually high compatibility concerns.
> I and Josh believe the introduction of a possible IAE if the
> comparator doesn't satisfy its contract is the right thing,
> but we'd also be willing to change the code to swallow
> the IAE
> or to do so conditionally based on the value of a system
> property.
> Keep in mind that a call to foreign code can throw any
> throwable at all,
> so a rogue comparator can cause arbitrary behavior even
> today.
>
> I think most people would agree that that catching these
> otherwise-silent
> failures is a good thing. The problem is the customer that
> upgrades the JDK
> on a production system and gets burnt by some broken third
> party code that
> "used" to work. Having some way to restore existing behavior
> would make this
> an easier sell. The suggestion from Jason to change it to an
> assertion might
> be worth thinking about too but I suspect that few
> developers test with
> assertions enabled.
>
> -Alan.
>
>
More information about the core-libs-dev
mailing list