Jump to content
Excelsior Forums


  • Content count

  • Joined

  • Last visited

Community Reputation

0 Neutral

About roedy

  • Rank
  • Birthday 02/04/1948

Profile Information

  • Gender
  • Location
    Victoria BC Canada
  • Interests
    see http://mindprod.com/contact/roedy.html
  1. roedy

    lower optization level

    Both with 32 bit 9.0 and 10.0 I frequently get the following message. This started happening when I flipped from JDK 1.7 to 1.8. I am using target 1.7. It appears to still work. I gather the problem is the 1.7-target byte code is different from true 1.7 byte code, and contains idioms Jet does not recognize. This could be fixed long before Jet fully supports 1.8 byte code, at least for a handful of the most common new idioms.
  2. roedy

    Crashes Messages

    I run one of the programs that got the HUGE_CLINITS message. It got an exception saying it could not load one of the classes with a large number of static inits. So I have had to revert 32 bit.
  3. roedy

    Crashes Messages

    I have just installed Jet 10.0 64bit and recompiled my stable of programs. I got this message frequently [exec] Crashes messages: [exec] 1: com.excelsior.jet.bjc.compiler.NotImplementedFeatureException: not implemented featur e HUGE_CLINITS Jet did not otherwise appear to crash. Does this mean my executables are defective?
  4. roedy

    SOLVED: NoClassDefFound

    I have written a little essay on the many possible causes of NoClassDefFoundError. See http://mindprod.com/jgloss/runerrormessages.html#NOCLASSDEFFOUNDERROR look for "the Scream"
  5. roedy

    exe file signature

    Here is what I said: Vladimir Parfinenko asked me to write you. I am in the process of writing a free opensource WHICH utility for Windows. Basically what it does it search the path and tell you about the instances of the executable it finds. I wanted to make it a little cleverer than the standard WHICH. also handle class and jar files by searching the classpath. let you know if the executable was Jet and hence needing a runtime. telling you the runtime it needed, so that if it were out of date, you would know to recompile it or get an updated version and updated runtime. This third feature would come it handy to make sure you had killed/replaced all the old *.exe files when you install a new Jet version. Officially Jet considers its exe format a proprietary secret, however, all I need in the file signature to let me tell a Jet exe apart from an ordinary exe, e.g. the hex offset of some distinctive few signature bytes. Similarly I would like to know where to extract the Jet runtime version the exe needs, including whether it is 32 or 64 bits. Some advantages of complying with my request: the utility is in effect a miniature advertisement for Jet. There will need to be included in the documentation what Jet is, why you might want it, and where to get it. It will get passed around to people piggybacked on my utility who might otherwise have never investigated Jet. The utility will help Jet users manage multiple Jet versions, and Jet upgrades, sorting out problems with mismatches. It will help notify your users of recent updates. My utility will indirectly notify them, if for some reason your emails do not get through. It will be my first utility that I also distribute in Jet EXE form. Because I maintain the Java glossary, the thousands of people a day who visit the site will be curious to try out my latest toy. The information I am asking for is something that any pirate could discover in less than a day. It is not really secret, just time consuming to glean indirectly. This information is of almost no use in disassembly.
  6. roedy

    exe file signature

    Let me explain what I want to do. I want to write a utility that you pass it the name of an exe, and its seaches the path to tell you about the first and all matching exes it finds. If it finds an exe that needs jet, it tells you if the run time it wants is older than than the most current. So I want to be able to read the first few bytes of the *.exe file and first of all determine if it is a jet exe, and if it is which version it wants so I can warn the user if it is out of date. Another way of asking, is I would like to see the code that the launcher uses to find the version. Ideally you would just say "The jet exe file signature is at hex offset yyyy and is the string 0xffeeddcc.... The version is at hex offsite zzzz and in an little-endian 2 bytes containing an int version * 100.
  7. roedy

    exe file signature

    How do you tell if an exe file is a Jet exefile and which version of Jet it wants? I presume there is something in the header.
  8. I wrote some months back that I got my main app, http://mindprod.com/products1.html#HTMLMACROS running 10% faster just by semi-automatically optimising the size of each new StringBuilder. This set me wondering how the optimisation process might be fine tuned further, and perhaps turned into a commercial tool to fine tune it for any app, or built into Jet. Let's assume that for every new StringBuilder invocation I collected statistics of every string built and how long it was over a sample run. Knowing that, how big should you make the initialisation parameter? Right now I pretty well always set it to the longest string. But in a few cases I made it shorter. Setting it to the longest string conserves CPU time in an infinitely RAM rich environment. However outside the government, you probably also want to conserve RAM, and garbage collection time, by making letting a few of the StringBuilders grow in return for most StringBuilders being smaller. You need some measure of tradeoff of doublings vs wasted bytes in a given invocation. I suppose you might find that number by experiment. A mindless algorithm might work like this: Simulate the doublings and wasted bytes of every for every possible StringBuilder size between min and max length and pick the optimal for each instance. This would not be done while the app was running, so even a crude (o n^2) algorithm like that would likely be acceptable. When you find them out, you modify the source, though in Jet's case it might just modify the object based on tables previously collected, somewhat the way JetPerfect used to work. Back then you rejected the idea as not generally applicable. By now you might be running out of ideas to keep Jet significantly faster than Sun JVM, and this optimisation may give you quite a boost for relatively little effort on a fairly large class of problem.
  9. roedy

    all ok

    I have not noticed any problems at all with beta 6.5. I have not used the new features however. It seems somewhat faster, but that could be an extra Gig of RAM I got at the same time.
  10. roedy

    Jet 6.4 beta, zip exception

    I was trying to figure out what zip it could be complaining about, and wondered if it were some zip in the runtime library. So I uninstalled JET and reinstalled and it worked fine. I gather something corrupted one of the runtime files.
  11. Exception in thread "main" java.lang.InternalError at java.lang.Void.<unknown>(Unknown Source) at java.lang.Void.<unknown>(Unknown Source) at java.lang.Void.<unknown>(Unknown Source) at java.lang.Void.<unknown>(Unknown Source) Caused by: java.util.zip.ZipException: error in opening zip file The only zip file I can think of is the jar, which should have been long gone by that point. There is a gzip of a registry entry. You can download the app with source and jar at http://mindprod.com/products1.html#VERCHECK is in a hybrid that can run as an Applet or application. It works fine in hotspot, and has been working fine for the last 26 versions. Even with that bug, your product in beta is far more bug free than most of the stuff other companies release.
  12. roedy

    locked files

    I have seen some suspicious events you might want to check out. I suspect that if I terminate a running Jet beta app under Vista, it does not always free its hold on open files. This causes subsequent runs to fail. Reboot clears these locks. The app where this happens is enormous but basically what it does is over and over read a file into RAM, process it, and if the processed results differ, it writes it back to a temp, deletes the original, and renames the temp to the original. If you don't see this behaviour, I can cook up an SSCCE for you (see http://mindprod.com/jgloss/sscce.html) that perhaps can demostrate it. I might not be Jet's fault. Vista seems to have problems generally with refusing access to files in unpredicable ways.
  13. I just recompiled 102 jars. I have not tested all of them, but a big chunk of them appear to be working fine. Maybe you guys won't need to wait till July to release 6.4. Congratulations!
  14. This is a simple request to modify the console log that Jet spits out as it compiles. There is a line like this: Reading vercheck.jar ... 45 classes I would like you to change that to: Reading >>>> vercheck.jar <<<< ... 45 classes Then you could tell as a glance looking at the log whipping by where Jet is in a long ant script.
  15. Here is a benchmark. Jet just beats out java -client, but java -server is 1.4 times as fast as Jet. I thought perhaps analysing this program might provide hints on how to improve Jet optimisation. I presume the problem is simply that -server has access to run time stats Jet does not. run it with Simplify.exe 10000000 3 Result with Athlon 64 X2 3800+ dual core, 2 gig ram. java -client Simplify 10000000 3 [* x [+ [+ [* 12 0] [+ 23 8]] y]] Bench 0 Took 4.422 seconds Bench 1 Took 4.728 seconds Bench 2 Took 4.408 seconds [* x [+ 31 y]] using jet Simplify.exe 10000000 3 [E:\exper]Simplify 10000000 3 [* x [+ [+ [* 12 0] [+ 23 8]] y]] Bench 0 Took 4.178 seconds Bench 1 Took 4.193 seconds Bench 2 Took 4.303 seconds [* x [+ 31 y]] java -server Simplify 10000000 3 [* x [+ [+ [* 12 0] [+ 23 8]] y]] Bench 0 Took 2.91 seconds Bench 1 Took 2.84 seconds Bench 2 Took 2.84 seconds [* x [+ 31 y]] ---- Simplify.java ----- // Simplify.java import java.math.BigDecimal; public class Simplify { public static void main(String[] args) { int lim = Integer.parseInt(args[0]); int nbench = Integer.parseInt(args[1]); Expr expr = mul(var("x"), add( add(mul(rat( 12 ),rat( 0 )), add(rat( 23 ),rat( 8 ))), var("y") ) ); System.out.println(expr); Expr reduced = null; for (int batch = 0; batch < nbench; batch++) { long start = System.currentTimeMillis(); System.err.println("Bench " + batch); for (int i = 0; i < lim; i++) { reduced = expr.simplify(); } System.err.println("Took " + (System.currentTimeMillis() - start) / 1000.0 + " seconds"); } System.out.println(reduced); } private static Expr mul(Expr a, Expr { return new Mul(a,; } private static Expr add(Expr a, Expr { return new Add(a,; } private static Expr rat(long a) { return Val.create(BigDecimal.valueOf(a)); } private static Expr var(String s) { return new Sym(s); } public static abstract class Expr { public abstract Expr simplify(); } public static final class Add extends Expr { private final Expr l, r; public Add(Expr l, Expr r) { this.l = l; this.r = r; } public Expr simplify() { return add(l.simplify(), r.simplify()); } private Expr add(Expr l, Expr r) { if (Val.ZERO == l) { return r; } else if (Val.ZERO == r) { return l; } else if (l instanceof Val && r instanceof Val) { return add((Val) l, (Val) r) ; } else if (r instanceof Add) { return add(l, (Add) r); } else { return new Add(l, r); } } private Expr add(Val l, Val r) { return Val.create(l.getValue().add(r.getValue())); } private Expr add(Expr l, Add r) { return new Add(new Add(l, r.l), r.r).simplify(); } public String toString() { return "[+ " + l + " " + r +"]"; } } public static class Mul extends Expr { private final Expr l, r; public Mul(Expr l, Expr r) { this.l = l; this.r = r; } public Expr simplify() { return mul(l.simplify(), r.simplify()); } private Expr mul(Expr l, Expr r) { if (Val.ZERO == l || Val.ZERO == r) { return Val.ZERO; } else if (Val.ONE == l) { return r; } else if (Val.ONE == r) { return l; } else if (l instanceof Val && r instanceof Val) { return mul((Val) l, (Val) r) ; } else if (r instanceof Mul) { return mul(l, (Mul) r); } else { return new Mul(l, r); } } private Expr mul(Val l, Val r) { return Val.create(l.getValue().multiply(r.getValue())); } private Expr mul(Expr l, Mul r) { return new Mul(new Mul(l, r.l), r.r).simplify(); } public String toString() { return "[* " + l + " " + r +"]"; } } public static class Sym extends Expr { private final String symbol; public Sym(String symbol) { this.symbol = symbol; } public Expr simplify() { return this; } public String toString() { return symbol; } } public static class Val extends Expr { public static final Val ZERO = new Val(BigDecimal.ZERO); public static final Val ONE = new Val(BigDecimal.ONE); private final BigDecimal value; private Val(BigDecimal value) { this.value = value; } public Expr simplify() { return this; } public static Val create(BigDecimal value) { if (BigDecimal.ZERO == value || BigDecimal.ZERO.equals(value)) { return ZERO; } else if (BigDecimal.ONE == value && BigDecimal.ONE.equals(value)) { return ONE; } else { return new Val(value); } } public BigDecimal getValue() { return value; } public String toString() { return String.valueOf(value); } } }