|
Thread Rules 1. This is not a "do my homework for me" thread. If you have specific questions, ask, but don't post an assignment or homework problem and expect an exact solution. 2. No recruiting for your cockamamie projects (you won't replace facebook with 3 dudes you found on the internet and $20) 3. If you can't articulate why a language is bad, don't start slinging shit about it. Just remember that nothing is worse than making CSS IE6 compatible. 4. Use [code] tags to format code blocks. |
Has been answered by following two posts
Thanks all! Makes a lot of sense. Shoulda read through more of the tutorial - it's mentioned in a later chapter it seems. So effectively it creates a new tuple (b,a) and immediately unpacks it, with the tuple (b,a) being a kind of temporary variable?
edit: nm about previous talk of creating new tuple - on seeing the python opcode - thanks for going over that! reading the documentation I'm a little unsure but STORE_NAME pops the stack as well?
also - I'll stop being a smartass about swapping variables and use a temp. I had never head of a 'pipeline stall' before but on reading about it, it makes sense.
Secondly, kind of related to something I asked earlier - I was running different ways to calculate fibonacci - realized it's a lot cheaper to calculate it without recursion, and I have some runtime differences I can't understand.
I have a dumb recursive way, a simple way that memorizes the results, a way that stores the results in an array (ed: nope - kind of what Java would do in the dynamic case of Java allowed tall call optimization?), and a way that only remembers the two most recent fibonacci numbers. These methods are dumbFib, dynamicFib, arrayFib, and smartFib recursively.
Because I got tired of writing lines 87-124 I wanted to write a method that could run my methods for comparison purposes. I added an interface called DecoratorInterface (side note: I should call it something else, this has no relation to Decorator pattern on 2nd thought).
When I ran it this 2nd time around - with addition of lines 77-83, the runtime for the 2nd array fib seems to have dropped and I don't know why.
+ Show Spoiler [output with lines 77-83 commented] + Array fib 14 Smart fib 5 Dumb fib 186 Dynamic fib 21
+ Show Spoiler [output with 77-83 uncommented] + Array fib1 16 Array fib 4 Smart fib 5 Dumb fib 211 Dynamic fib 25
http://pastebin.com/KUFZjYga
I'm of course trying to work it out myself too - just figured I'd ask while it seems a lot of people are around to answer.
ed: My first thought was that maybe I didn't understand how static functions worked in Java and that the variable was only created once (like having a static variable in a function in PHP). That's why I had that printMe check - I just called arrayFib at the end to check the size of the array. But a new array is created on every function call, so I don't know why creating the array once would help me the 2nd time the array was called. I also thought maybe there is some compiler magic, so I moved my 2nd arrayFib check to the end of main - so it did the 3 other tests before calling arrayFib again. Given that I was checking for 'magic', I'm not sure what I was expecting, but it didn't make a difference. So that's where I'm looking at now.
Btw really all - thanks a lot for putting up with these dumb questions
|
Its a difference of 10ms, its not really significant. In any case, calling the method 20k times could easily trigger the JIT to try and optimize harder, and those optimizations would benefit your second round of calls. I wouldn't really worry about it or care in the slightest.
Commenting on the rest of your code: Most of your tests aren't really valid; you're not resetting their stored state between test iterations, so they're the slowest they'll ever be for the first iteration and then blazing fast after that. That's not at all a fair comparison to the dumbFib method. Furthermore, if your timings are returning 4-5ms for all your iterations to run, you should probably be running them more to get anywhere near an idea of how fast they are. After all, you saw yourself that simply adding a method call could add 12ms to the total run, which is 3x what your Array test was giving as a result. Way too much error involved there.
|
If you want to test the speed of your fibonacci implementations, I would suggest calling fib(1000) or some such. Running fib(20) a thousand times is rather pointless.
|
Ok guys, thanks for that. Regarding:
"Most of your tests aren't really valid; you're not resetting their stored state between test iterations, so they're the slowest they'll ever be for the first iteration and then blazing fast after that. "
This applies only to dynamicFib, which uses a static variable right? arrayFib array is a local variable so every iteration creates a new array?
Anyway, I was also conflating some other things because my question was mainly pertaining to the differences in the 2 arrayFibs times, so I should have commented out the other tests.
When I changed it to something different (compute fib(1000) 2 million times, not computing fib[1...20] 1000 times), there was no real difference in the arrayFib runtime with lines commented or not, and as expected the testMe method took a bit longer on every run because of the overhead of the extra method call. Idk what stock I was reading into a 4ms difference...I had just gotten impatient testing because dumbFib with even fib(40) took so long that I went with these tiny numbers.
Updated code is: http://pastebin.com/P9VszeWE
In case anyone was curious: Runtime for arrayFib ranged from 7900-8100 ms when I ran it alone. When I ran them together, runtime for arrayFib1 ranged from 7900 to 8400 ms and arrayFib was 7600 to 7800 ms
|
does anyone have any good resources for learning and practicing SQL Triggers? MySQL preferred but at this point i'll take what i can get. i have a decent theoretical understanding on how to use them, i'm really just looking more for syntax things and good ways to practice implementing them. thanks in advance.
|
On August 04 2013 10:16 sqrt wrote: I looked at the tutorials for OpenGL in the OP, but they seem to be quite dated, can anyone recommend me a more modern tutorial? Or should I just work with older versions?
P.S. I'm using Windows.
I can highly recommend http://www.opengl-tutorial.org/ helped me a ton at school this year, you can check the full code at https://code.google.com/p/opengl-tutorial-org/source/browse/ took me some time before I found that :D I wouldn't recommend learning old OpenGL (older than 3.1) if you wanna develop for desktop (OpenGL ES uses some of the old stuff I think).
|
Thanks for this, it sort of works.
On August 04 2013 16:46 Encdalf wrote:Show nested quote +On August 03 2013 03:47 HardlyNever wrote: [...] Does anyhow know how to get this piece of crap to load at an earlier version correctly, so I don't have to physically go check it on an old machine? The developer tools in the IE are good for a quick peek, but well that's about it. It won't simulate an earlier version 100%, instead you get an earlier version with enhancements, i.e. IE9 debug tools would make you think media queries work in IE8. As for the mentioned IE Tester, I havn't used that for a while since it constantly crashed on my system and printing didn't work. In my current setup I use virtual machines with remote desktop connections for compatibility checks in older IE versions since that way I also have the operating system as a test platform, which at least for me is a requirement in some cases. There are also services like https://saucelabs.com/ or http://www.browserstack.com/ which will provide you with other version/os combinations but these cost money.
I think just the IE9 version isn't working right on the tester linked above. Any page I try to load in an IE9 tab just crashes. The IE8 tab seems to be working, though.
|
|
|
On August 05 2013 11:04 heroyi wrote:Show nested quote +On August 05 2013 10:30 darkness wrote: I'm looking to sharpen my programming skills as I feel I'm not doing anything useful these days to become better. Once I'm done with studies, I'd like to work as a software engineer, but I'd rather use the time while I'm studying at university. I'm on my 3rd and last year of BSc in Software Development programme. I plan to follow it up with MSc in the same field if possible.
...
Edit: When people say "study algorithms and data structures", do you mean to memorise algorithms or just to have an idea about an algorithm and to know how to google it? Essentially the latter. A lot of languages come with their own little algorithms built in (i.e java for sort etc...). Essentially know the practicality and downfall of each and know when to implement which (red black tree vs sorts etc...). It seems a lot of programming is just knowing the abstract level which makes sense considering if you can't design a blueprint of what you want the program to do then it doesn't matter how well you know about a language.
Any algorithms & data structures book you'd recommend or is google enough to learn this?
|
On August 06 2013 03:22 darkness wrote:Show nested quote +On August 05 2013 11:04 heroyi wrote:On August 05 2013 10:30 darkness wrote: I'm looking to sharpen my programming skills as I feel I'm not doing anything useful these days to become better. Once I'm done with studies, I'd like to work as a software engineer, but I'd rather use the time while I'm studying at university. I'm on my 3rd and last year of BSc in Software Development programme. I plan to follow it up with MSc in the same field if possible.
...
Edit: When people say "study algorithms and data structures", do you mean to memorise algorithms or just to have an idea about an algorithm and to know how to google it? Essentially the latter. A lot of languages come with their own little algorithms built in (i.e java for sort etc...). Essentially know the practicality and downfall of each and know when to implement which (red black tree vs sorts etc...). It seems a lot of programming is just knowing the abstract level which makes sense considering if you can't design a blueprint of what you want the program to do then it doesn't matter how well you know about a language. Any algorithms & data structures book you'd recommend or is google enough to learn this?
I think that depends on your preferences. By now you can learn pretty much everything with Internet ressources, but I would recommend buying the classic http://upload.wikimedia.org/wikipedia/en/thumb/4/41/Clrs3.jpeg/220px-Clrs3.jpeg . This way you don't risk getting too much false/problematic information.
|
On August 06 2013 03:22 darkness wrote:Show nested quote +On August 05 2013 11:04 heroyi wrote:On August 05 2013 10:30 darkness wrote: I'm looking to sharpen my programming skills as I feel I'm not doing anything useful these days to become better. Once I'm done with studies, I'd like to work as a software engineer, but I'd rather use the time while I'm studying at university. I'm on my 3rd and last year of BSc in Software Development programme. I plan to follow it up with MSc in the same field if possible.
...
Edit: When people say "study algorithms and data structures", do you mean to memorise algorithms or just to have an idea about an algorithm and to know how to google it? Essentially the latter. A lot of languages come with their own little algorithms built in (i.e java for sort etc...). Essentially know the practicality and downfall of each and know when to implement which (red black tree vs sorts etc...). It seems a lot of programming is just knowing the abstract level which makes sense considering if you can't design a blueprint of what you want the program to do then it doesn't matter how well you know about a language. Any algorithms & data structures book you'd recommend or is google enough to learn this? If you have a very strong math background, Knuth is good. If not, the above suggestion is really good.
|
On August 05 2013 19:16 teamamerica wrote:Ok guys, thanks for that. Regarding: "Most of your tests aren't really valid; you're not resetting their stored state between test iterations, so they're the slowest they'll ever be for the first iteration and then blazing fast after that. " This applies only to dynamicFib, which uses a static variable right? arrayFib array is a local variable so every iteration creates a new array? Anyway, I was also conflating some other things because my question was mainly pertaining to the differences in the 2 arrayFibs times, so I should have commented out the other tests. When I changed it to something different (compute fib(1000) 2 million times, not computing fib[1...20] 1000 times), there was no real difference in the arrayFib runtime with lines commented or not, and as expected the testMe method took a bit longer on every run because of the overhead of the extra method call. Idk what stock I was reading into a 4ms difference...I had just gotten impatient testing because dumbFib with even fib(40) took so long that I went with these tiny numbers. Updated code is: http://pastebin.com/P9VszeWEIn case anyone was curious: Runtime for arrayFib ranged from 7900-8100 ms when I ran it alone. When I ran them together, runtime for arrayFib1 ranged from 7900 to 8400 ms and arrayFib was 7600 to 7800 ms Yeah, my comment would only apply to dynamicFib. The rest are stateless between method calls, so they don't have that issue.
Anyway, I do have some suggestions for your code if you'd like them:
First, I think wrapping the methods like you are is a bit weird. The thought that spurred it is good (reducing repeated code), but passing methods around in Java always ends up being painful and hard to read due to its lack of first-class functions. I'd recommend instead creating an interface for a FibonacciSolver or something along those lines, e.g.:
public interface FibonacciSolver { long find(int n); } Then you can create implementations for each of your strategies, and reduce your main method to something like:
public static void main(String args[]) { FibonacciSolver solvers[] = { new ArrayFibonacciSolver(), new DynamicFibonacciSolver(), new DumbFibonacciSolver() };
for(FibonacciSolver solver : solvers) { long startTime = System.currentTimeMillis(); for (int i = 0; i < NUM_ITERATIONS; i++) { solver.find(MAX_FIB); } long endTime = System.currentTimeMillis(); System.out.println(solver.class.getSimpleName() + ": " + (endTime - startTime) + "ms"); } }
I think ideally you would also provide a standard setup/teardown for each method, and do so before each test iteration, but this would probably be hard to separate from your timing unless you started using a higher resolution timer.
Also, if you really want any idea of where the advantages lie in any of these methods, you really need to take a different approach than sequentially picking n's or just choosing 1 large n. Doing either of those gives advantages to some methods while giving extreme disadvantages to others. I doubt you care too much how accurate your comparisons are, but its something to think about.
|
On August 05 2013 18:03 gedatsu wrote:Show nested quote +On August 05 2013 16:49 teamamerica wrote:But in Java the simplest way I can think of (and this only works for switching two integers) is b = a + b a = b - a b = b - a
You can avoid overflow by using xor: b = a^b; a = a^b; b = a^b; I think this (and your method) can create a pipeline stall however, so it's not necessarily faster than swapping with the normal method of using an extra variable. Show nested quote +So I have a few questions: 1) In Java, is there a simple way to switch two objects without creating a temp object? You only create objects by using the 'new' command. Since you can have two names referencing the same object, that is the best way to swap them and no extra object is created.
Compilers can figure out the fastest way to swap based on your architecture and language. They recognize this sort of pattern pretty well.
EDIT: confirmed: xor swaps, arithemetic swaps, an temporary variable swaps are all treated by the compiler to generate identical assembly. There is one case where this is not true, when a temporary variable is used for several uses, it is assumed the user did want to use a temporary holding state, usually a register.
|
On August 05 2013 17:43 Nesserev wrote:I beg to differ... but Python's okay. After doing a lot of coding in C and C++, going back to Python was a real headache.
Yeah I'm having the same issue right now and alleviated it by working with C# ^^
C/C++ syntax is so much more well structured than Python since Python's mainly for scripting and being clean and verbose, so swapping between them feels so odd. But I love how quickly I can write up a simple script to say, just look at the assembly of Python code, and then CTRL+B to run.
But mainly, writing classes in Python hurts so much coming from C/C++. TT
|
Visual C++ 2012 question, where should I put my .ini-files so that files in the project can read it? I tried different things, and it doesn't seem to work in the same way as it did in VS2010
|
I made a program (homework) that solves the satisfiabilty of CNF clauses using Hill Climbing (as stated on the instructions). Now my problem is that I seem to get stuck at the local maxima. I want to escape it (using walksat) but I dont seem to understand how to implement the algorithm. Anybody care to help?
here's my code btw
+ Show Spoiler + import java.util.Arrays;
public class HillClimbing {
public static int[] literals = new int[8]; public static void main(String[] args) { // TODO Auto-generated method stub // randomize(literals); // Randomize initial state. boolean[] startingState = new boolean[8]; boolean[] leftNeighbor; boolean[] rightNeighbor; int Number = 0; int numOfSatClause = 0; Number = generateRandomStart(startingState); while(numOfSatClause < 10){ leftNeighbor = generateNeighbor(Number-1); rightNeighbor = generateNeighbor(Number+1); if (checkSat(startingState) < checkSat(leftNeighbor)){ numOfSatClause = checkSat(leftNeighbor); startingState = leftNeighbor; Number--; System.out.println("Changing starting state"); } else { numOfSatClause = checkSat(rightNeighbor); startingState = rightNeighbor; System.out.println("Changing starting state"); Number++; } } System.out.println("Number of true clauses: " + numOfSatClause); System.out.println(Number + " = " + Arrays.toString(startingState));
} private static int checkSat(boolean[] state) { int ctr = 0; if(!state[7] || !state[5] || !state[4] || state[3]) // ~A V ~C V ~D V E ctr++; if(!state[7] || !state[6] || !state[4] || !state[0]) // ~A V ~B V ~D V ~H ctr++; if(state[6] || state[4] || !state[2] || !state[0]) // B V D V ~F V ~H ctr++; if(state[6] || !state[5] || state[1] || !state[0]) // B V ~C V G V ~H ctr++; if(!state[6] || state[5] || !state[2] || !state[1]) // ~B V C V ~F V ~G ctr++; if(state[5] || !state[4] || state[3] || !state[0]) // C V ~D V E V ~H ctr++; if(!state[5] || state[4] || !state[3] || !state[2]) // ~C V D V ~E V ~F ctr++; if(state[6] || !state[4] || !state[2] || state[0]) // B V ~D V ~F V H ctr++; if(!state[7] || !state[5] || !state[4] || state[3]) // ~A V ~C V ~D V E ctr++; if(state[6] || state[5] || !state[4] || !state[2]) // B V C V ~D V ~F ctr++; return ctr; }
private static boolean[] generateNeighbor(int randomNumber) { boolean[] neighbor = new boolean[8]; for (int i = 7; i >= 0; i--) { neighbor[i] = (randomNumber & (1 << i)) != 0; } System.out.println(randomNumber + " = " + Arrays.toString(neighbor)); return neighbor; } private static int generateRandomStart(boolean[] startingState) { int input = (int) (Math.random()*(128)); for (int i = 6; i >= 0; i--) { startingState[i] = (input & (1 << i)) != 0; }
System.out.println(input + " = " + Arrays.toString(startingState)); return input; } }
|
On August 06 2013 21:34 WindWolf wrote: Visual C++ 2012 question, where should I put my .ini-files so that files in the project can read it? I tried different things, and it doesn't seem to work in the same way as it did in VS2010 VS12 should put your executable into /bin/Debug/, and if you put your files in there you can access them easily using a relative path. If you put the file into your project folders and set "copy to output directory" in the file properties to "copy always" or "copy if newer", then the file should be copied into your /bin/Debug/ on build, using the relative path from the project root.
|
On August 06 2013 23:38 spinesheath wrote:Show nested quote +On August 06 2013 21:34 WindWolf wrote: Visual C++ 2012 question, where should I put my .ini-files so that files in the project can read it? I tried different things, and it doesn't seem to work in the same way as it did in VS2010 VS12 should put your executable into /bin/Debug/, and if you put your files in there you can access them easily using a relative path. If you put the file into your project folders and set "copy to output directory" in the file properties to "copy always" or "copy if newer", then the file should be copied into your /bin/Debug/ on build, using the relative path from the project root. I can't find the "copy to output directory" settings anywhere in VS2012. Where is it locaed, I've searched both my project settings, solution settings and file settings for my ini-file
|
On August 07 2013 00:11 WindWolf wrote:Show nested quote +On August 06 2013 23:38 spinesheath wrote:On August 06 2013 21:34 WindWolf wrote: Visual C++ 2012 question, where should I put my .ini-files so that files in the project can read it? I tried different things, and it doesn't seem to work in the same way as it did in VS2010 VS12 should put your executable into /bin/Debug/, and if you put your files in there you can access them easily using a relative path. If you put the file into your project folders and set "copy to output directory" in the file properties to "copy always" or "copy if newer", then the file should be copied into your /bin/Debug/ on build, using the relative path from the project root. I can't find the "copy to output directory" settings anywhere in VS2012. Where is it locaed, I've searched both my project settings, solution settings and file settings for my ini-file Select all of the project files in the solution explorer and in the properties panel click Copy to Output.
|
On August 07 2013 00:27 stormchaser wrote:Show nested quote +On August 07 2013 00:11 WindWolf wrote:On August 06 2013 23:38 spinesheath wrote:On August 06 2013 21:34 WindWolf wrote: Visual C++ 2012 question, where should I put my .ini-files so that files in the project can read it? I tried different things, and it doesn't seem to work in the same way as it did in VS2010 VS12 should put your executable into /bin/Debug/, and if you put your files in there you can access them easily using a relative path. If you put the file into your project folders and set "copy to output directory" in the file properties to "copy always" or "copy if newer", then the file should be copied into your /bin/Debug/ on build, using the relative path from the project root. I can't find the "copy to output directory" settings anywhere in VS2012. Where is it locaed, I've searched both my project settings, solution settings and file settings for my ini-file Select all of the project files in the solution explorer and in the properties panel click Copy to Output. http://i.imgur.com/YjuZzPx.png
This is everything I see in the properties panel (The full path is whited out by me)
|
|
|
|
|
|