├── .gitignore ├── LICENSE ├── README.md ├── pom.xml └── src └── main ├── java └── psy │ └── lob │ └── saw │ ├── BaselineBenchmarks.java │ ├── LoopyBenchmarks.java │ ├── conc │ ├── FalseSharingBenchmarkLazySet.java │ ├── FalseSharingBenchmarkPlain.java │ └── FalseSharingBenchmarkVolatile.java │ ├── utf8 │ ├── CustomUtf8Encoder.java │ ├── UnsafeCharBuffer.java │ ├── UnsafeDirectByteBuffer.java │ ├── UnsafeString.java │ └── Utf8EncodingBenchmark.java │ └── util │ └── UnsafeAccess.java └── resources ├── LICENSE └── Utf8Samples.txt /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Package Files # 4 | *.jar 5 | *.war 6 | *.ear 7 | /target 8 | /.settings 9 | /.classpath 10 | /.project 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The GNU General Public License (GPL) 2 | 3 | Version 2, June 1991 4 | 5 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. 6 | 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 7 | 8 | Everyone is permitted to copy and distribute verbatim copies of this license 9 | document, but changing it is not allowed. 10 | 11 | Preamble 12 | 13 | The licenses for most software are designed to take away your freedom to share 14 | and change it. By contrast, the GNU General Public License is intended to 15 | guarantee your freedom to share and change free software--to make sure the 16 | software is free for all its users. This General Public License applies to 17 | most of the Free Software Foundation's software and to any other program whose 18 | authors commit to using it. (Some other Free Software Foundation software is 19 | covered by the GNU Library General Public License instead.) You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not price. Our 23 | General Public Licenses are designed to make sure that you have the freedom to 24 | distribute copies of free software (and charge for this service if you wish), 25 | that you receive source code or can get it if you want it, that you can change 26 | the software or use pieces of it in new free programs; and that you know you 27 | can do these things. 28 | 29 | To protect your rights, we need to make restrictions that forbid anyone to deny 30 | you these rights or to ask you to surrender the rights. These restrictions 31 | translate to certain responsibilities for you if you distribute copies of the 32 | software, or if you modify it. 33 | 34 | For example, if you distribute copies of such a program, whether gratis or for 35 | a fee, you must give the recipients all the rights that you have. You must 36 | make sure that they, too, receive or can get the source code. And you must 37 | show them these terms so they know their rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and (2) 40 | offer you this license which gives you legal permission to copy, distribute 41 | and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain that 44 | everyone understands that there is no warranty for this free software. If the 45 | software is modified by someone else and passed on, we want its recipients to 46 | know that what they have is not the original, so that any problems introduced 47 | by others will not reflect on the original authors' reputations. 48 | 49 | Finally, any free program is threatened constantly by software patents. We 50 | wish to avoid the danger that redistributors of a free program will 51 | individually obtain patent licenses, in effect making the program proprietary. 52 | To prevent this, we have made it clear that any patent must be licensed for 53 | everyone's free use or not licensed at all. 54 | 55 | The precise terms and conditions for copying, distribution and modification 56 | follow. 57 | 58 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 59 | 60 | 0. This License applies to any program or other work which contains a notice 61 | placed by the copyright holder saying it may be distributed under the terms of 62 | this General Public License. The "Program", below, refers to any such program 63 | or work, and a "work based on the Program" means either the Program or any 64 | derivative work under copyright law: that is to say, a work containing the 65 | Program or a portion of it, either verbatim or with modifications and/or 66 | translated into another language. (Hereinafter, translation is included 67 | without limitation in the term "modification".) Each licensee is addressed as 68 | "you". 69 | 70 | Activities other than copying, distribution and modification are not covered by 71 | this License; they are outside its scope. The act of running the Program is 72 | not restricted, and the output from the Program is covered only if its contents 73 | constitute a work based on the Program (independent of having been made by 74 | running the Program). Whether that is true depends on what the Program does. 75 | 76 | 1. You may copy and distribute verbatim copies of the Program's source code as 77 | you receive it, in any medium, provided that you conspicuously and 78 | appropriately publish on each copy an appropriate copyright notice and 79 | disclaimer of warranty; keep intact all the notices that refer to this License 80 | and to the absence of any warranty; and give any other recipients of the 81 | Program a copy of this License along with the Program. 82 | 83 | You may charge a fee for the physical act of transferring a copy, and you may 84 | at your option offer warranty protection in exchange for a fee. 85 | 86 | 2. You may modify your copy or copies of the Program or any portion of it, thus 87 | forming a work based on the Program, and copy and distribute such modifications 88 | or work under the terms of Section 1 above, provided that you also meet all of 89 | these conditions: 90 | 91 | a) You must cause the modified files to carry prominent notices stating 92 | that you changed the files and the date of any change. 93 | 94 | b) You must cause any work that you distribute or publish, that in whole or 95 | in part contains or is derived from the Program or any part thereof, to be 96 | licensed as a whole at no charge to all third parties under the terms of 97 | this License. 98 | 99 | c) If the modified program normally reads commands interactively when run, 100 | you must cause it, when started running for such interactive use in the 101 | most ordinary way, to print or display an announcement including an 102 | appropriate copyright notice and a notice that there is no warranty (or 103 | else, saying that you provide a warranty) and that users may redistribute 104 | the program under these conditions, and telling the user how to view a copy 105 | of this License. (Exception: if the Program itself is interactive but does 106 | not normally print such an announcement, your work based on the Program is 107 | not required to print an announcement.) 108 | 109 | These requirements apply to the modified work as a whole. If identifiable 110 | sections of that work are not derived from the Program, and can be reasonably 111 | considered independent and separate works in themselves, then this License, and 112 | its terms, do not apply to those sections when you distribute them as separate 113 | works. But when you distribute the same sections as part of a whole which is a 114 | work based on the Program, the distribution of the whole must be on the terms 115 | of this License, whose permissions for other licensees extend to the entire 116 | whole, and thus to each and every part regardless of who wrote it. 117 | 118 | Thus, it is not the intent of this section to claim rights or contest your 119 | rights to work written entirely by you; rather, the intent is to exercise the 120 | right to control the distribution of derivative or collective works based on 121 | the Program. 122 | 123 | In addition, mere aggregation of another work not based on the Program with the 124 | Program (or with a work based on the Program) on a volume of a storage or 125 | distribution medium does not bring the other work under the scope of this 126 | License. 127 | 128 | 3. You may copy and distribute the Program (or a work based on it, under 129 | Section 2) in object code or executable form under the terms of Sections 1 and 130 | 2 above provided that you also do one of the following: 131 | 132 | a) Accompany it with the complete corresponding machine-readable source 133 | code, which must be distributed under the terms of Sections 1 and 2 above 134 | on a medium customarily used for software interchange; or, 135 | 136 | b) Accompany it with a written offer, valid for at least three years, to 137 | give any third party, for a charge no more than your cost of physically 138 | performing source distribution, a complete machine-readable copy of the 139 | corresponding source code, to be distributed under the terms of Sections 1 140 | and 2 above on a medium customarily used for software interchange; or, 141 | 142 | c) Accompany it with the information you received as to the offer to 143 | distribute corresponding source code. (This alternative is allowed only 144 | for noncommercial distribution and only if you received the program in 145 | object code or executable form with such an offer, in accord with 146 | Subsection b above.) 147 | 148 | The source code for a work means the preferred form of the work for making 149 | modifications to it. For an executable work, complete source code means all 150 | the source code for all modules it contains, plus any associated interface 151 | definition files, plus the scripts used to control compilation and installation 152 | of the executable. However, as a special exception, the source code 153 | distributed need not include anything that is normally distributed (in either 154 | source or binary form) with the major components (compiler, kernel, and so on) 155 | of the operating system on which the executable runs, unless that component 156 | itself accompanies the executable. 157 | 158 | If distribution of executable or object code is made by offering access to copy 159 | from a designated place, then offering equivalent access to copy the source 160 | code from the same place counts as distribution of the source code, even though 161 | third parties are not compelled to copy the source along with the object code. 162 | 163 | 4. You may not copy, modify, sublicense, or distribute the Program except as 164 | expressly provided under this License. Any attempt otherwise to copy, modify, 165 | sublicense or distribute the Program is void, and will automatically terminate 166 | your rights under this License. However, parties who have received copies, or 167 | rights, from you under this License will not have their licenses terminated so 168 | long as such parties remain in full compliance. 169 | 170 | 5. You are not required to accept this License, since you have not signed it. 171 | However, nothing else grants you permission to modify or distribute the Program 172 | or its derivative works. These actions are prohibited by law if you do not 173 | accept this License. Therefore, by modifying or distributing the Program (or 174 | any work based on the Program), you indicate your acceptance of this License to 175 | do so, and all its terms and conditions for copying, distributing or modifying 176 | the Program or works based on it. 177 | 178 | 6. Each time you redistribute the Program (or any work based on the Program), 179 | the recipient automatically receives a license from the original licensor to 180 | copy, distribute or modify the Program subject to these terms and conditions. 181 | You may not impose any further restrictions on the recipients' exercise of the 182 | rights granted herein. You are not responsible for enforcing compliance by 183 | third parties to this License. 184 | 185 | 7. If, as a consequence of a court judgment or allegation of patent 186 | infringement or for any other reason (not limited to patent issues), conditions 187 | are imposed on you (whether by court order, agreement or otherwise) that 188 | contradict the conditions of this License, they do not excuse you from the 189 | conditions of this License. If you cannot distribute so as to satisfy 190 | simultaneously your obligations under this License and any other pertinent 191 | obligations, then as a consequence you may not distribute the Program at all. 192 | For example, if a patent license would not permit royalty-free redistribution 193 | of the Program by all those who receive copies directly or indirectly through 194 | you, then the only way you could satisfy both it and this License would be to 195 | refrain entirely from distribution of the Program. 196 | 197 | If any portion of this section is held invalid or unenforceable under any 198 | particular circumstance, the balance of the section is intended to apply and 199 | the section as a whole is intended to apply in other circumstances. 200 | 201 | It is not the purpose of this section to induce you to infringe any patents or 202 | other property right claims or to contest validity of any such claims; this 203 | section has the sole purpose of protecting the integrity of the free software 204 | distribution system, which is implemented by public license practices. Many 205 | people have made generous contributions to the wide range of software 206 | distributed through that system in reliance on consistent application of that 207 | system; it is up to the author/donor to decide if he or she is willing to 208 | distribute software through any other system and a licensee cannot impose that 209 | choice. 210 | 211 | This section is intended to make thoroughly clear what is believed to be a 212 | consequence of the rest of this License. 213 | 214 | 8. If the distribution and/or use of the Program is restricted in certain 215 | countries either by patents or by copyrighted interfaces, the original 216 | copyright holder who places the Program under this License may add an explicit 217 | geographical distribution limitation excluding those countries, so that 218 | distribution is permitted only in or among countries not thus excluded. In 219 | such case, this License incorporates the limitation as if written in the body 220 | of this License. 221 | 222 | 9. The Free Software Foundation may publish revised and/or new versions of the 223 | General Public License from time to time. Such new versions will be similar in 224 | spirit to the present version, but may differ in detail to address new problems 225 | or concerns. 226 | 227 | Each version is given a distinguishing version number. If the Program 228 | specifies a version number of this License which applies to it and "any later 229 | version", you have the option of following the terms and conditions either of 230 | that version or of any later version published by the Free Software Foundation. 231 | If the Program does not specify a version number of this License, you may 232 | choose any version ever published by the Free Software Foundation. 233 | 234 | 10. If you wish to incorporate parts of the Program into other free programs 235 | whose distribution conditions are different, write to the author to ask for 236 | permission. For software which is copyrighted by the Free Software Foundation, 237 | write to the Free Software Foundation; we sometimes make exceptions for this. 238 | Our decision will be guided by the two goals of preserving the free status of 239 | all derivatives of our free software and of promoting the sharing and reuse of 240 | software generally. 241 | 242 | NO WARRANTY 243 | 244 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR 245 | THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE 246 | STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE 247 | PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 248 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 249 | FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND 250 | PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, 251 | YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 252 | 253 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL 254 | ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE 255 | PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 256 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR 257 | INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA 258 | BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 259 | FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER 260 | OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 261 | 262 | END OF TERMS AND CONDITIONS 263 | 264 | How to Apply These Terms to Your New Programs 265 | 266 | If you develop a new program, and you want it to be of the greatest possible 267 | use to the public, the best way to achieve this is to make it free software 268 | which everyone can redistribute and change under these terms. 269 | 270 | To do so, attach the following notices to the program. It is safest to attach 271 | them to the start of each source file to most effectively convey the exclusion 272 | of warranty; and each file should have at least the "copyright" line and a 273 | pointer to where the full notice is found. 274 | 275 | One line to give the program's name and a brief idea of what it does. 276 | 277 | Copyright (C) 278 | 279 | This program is free software; you can redistribute it and/or modify it 280 | under the terms of the GNU General Public License as published by the Free 281 | Software Foundation; either version 2 of the License, or (at your option) 282 | any later version. 283 | 284 | This program is distributed in the hope that it will be useful, but WITHOUT 285 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 286 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 287 | more details. 288 | 289 | You should have received a copy of the GNU General Public License along 290 | with this program; if not, write to the Free Software Foundation, Inc., 59 291 | Temple Place, Suite 330, Boston, MA 02111-1307 USA 292 | 293 | Also add information on how to contact you by electronic and paper mail. 294 | 295 | If the program is interactive, make it output a short notice like this when it 296 | starts in an interactive mode: 297 | 298 | Gnomovision version 69, Copyright (C) year name of author Gnomovision comes 299 | with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free 300 | software, and you are welcome to redistribute it under certain conditions; 301 | type 'show c' for details. 302 | 303 | The hypothetical commands 'show w' and 'show c' should show the appropriate 304 | parts of the General Public License. Of course, the commands you use may be 305 | called something other than 'show w' and 'show c'; they could even be 306 | mouse-clicks or menu items--whatever suits your program. 307 | 308 | You should also get your employer (if you work as a programmer) or your school, 309 | if any, to sign a "copyright disclaimer" for the program, if necessary. Here 310 | is a sample; alter the names: 311 | 312 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 313 | 'Gnomovision' (which makes passes at compilers) written by James Hacker. 314 | 315 | signature of Ty Coon, 1 April 1989 316 | 317 | Ty Coon, President of Vice 318 | 319 | This General Public License does not permit incorporating your program into 320 | proprietary programs. If your program is a subroutine library, you may 321 | consider it more useful to permit linking proprietary applications with the 322 | library. If this is what you want to do, use the GNU Library General Public 323 | License instead of this License. 324 | 325 | 326 | "CLASSPATH" EXCEPTION TO THE GPL 327 | 328 | Certain source files distributed by Oracle America and/or its affiliates are 329 | subject to the following clarification and special exception to the GPL, but 330 | only where Oracle has expressly included in the particular source file's header 331 | the words "Oracle designates this particular file as subject to the "Classpath" 332 | exception as provided by Oracle in the LICENSE file that accompanied this code." 333 | 334 | Linking this library statically or dynamically with other modules is making 335 | a combined work based on this library. Thus, the terms and conditions of 336 | the GNU General Public License cover the whole combination. 337 | 338 | As a special exception, the copyright holders of this library give you 339 | permission to link this library with independent modules to produce an 340 | executable, regardless of the license terms of these independent modules, 341 | and to copy and distribute the resulting executable under terms of your 342 | choice, provided that you also meet, for each linked independent module, 343 | the terms and conditions of the license of that module. An independent 344 | module is a module which is not derived from or based on this library. If 345 | you modify this library, you may extend this exception to your version of 346 | the library, but you are not obligated to do so. If you do not wish to do 347 | so, delete this exception statement from your version. 348 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | jmh-samples 2 | =========== 3 | NOTE: As of 15/06/2013 the jar/samples were up to date. JMH has come a long way since and is much easier to play with.
4 | I have now removed the old jar/samples and use the maven hosted dependency instead.
5 | JMH samples.
6 | This was setup to support my 2 blog posts about JMH:
7 | http://psy-lob-saw.blogspot.com/2013/05/using-jmh-to-benchmark-multi-threaded.html
8 | http://psy-lob-saw.blogspot.com/2013/04/writing-java-micro-benchmarks-with-jmh.html
9 | And contains the examples discussed under the psy.lob.saw package.
10 | The JMH framework is hosted here: http://openjdk.java.net/projects/code-tools/jmh/
11 | The JMH samples are a MUST read (and are always up to date): http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
12 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | org.openjdk.jmh 5 | jmh-samples 6 | jar 7 | 1.1-SNAPSHOT 8 | Java Microbenchmark Harness Samples 9 | 10 | 11 | 12 | org.openjdk.jmh 13 | jmh-core 14 | 1.8 15 | 16 | 17 | org.openjdk.jmh 18 | jmh-generator-annprocess 19 | 1.8 20 | provided 21 | 22 | 23 | 24 | 25 | UTF-8 26 | 27 | 28 | 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.0 34 | 35 | 1.8 36 | 1.6 37 | 1.6 38 | 39 | 40 | 41 | org.apache.maven.plugins 42 | maven-shade-plugin 43 | 2.0 44 | 45 | 46 | package 47 | 48 | shade 49 | 50 | 51 | microbenchmarks 52 | 53 | 54 | org.openjdk.jmh.Main 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/BaselineBenchmarks.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | import org.openjdk.jmh.annotations.Benchmark; 6 | import org.openjdk.jmh.annotations.BenchmarkMode; 7 | import org.openjdk.jmh.annotations.Mode; 8 | import org.openjdk.jmh.annotations.OutputTimeUnit; 9 | import org.openjdk.jmh.annotations.Scope; 10 | import org.openjdk.jmh.annotations.State; 11 | 12 | @BenchmarkMode(Mode.AverageTime) 13 | @OutputTimeUnit(TimeUnit.NANOSECONDS) 14 | @State(Scope.Thread) 15 | public class BaselineBenchmarks { 16 | int i; 17 | @Benchmark 18 | public void noop() { 19 | } 20 | 21 | @Benchmark 22 | public void increment() { 23 | i++; 24 | } 25 | 26 | @Benchmark 27 | public int incrementConsume() { 28 | return i++; 29 | } 30 | 31 | @Benchmark 32 | public int consume() { 33 | return i; 34 | } 35 | 36 | @Benchmark 37 | public int consumeAdd() { 38 | return i + 1; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/LoopyBenchmarks.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | import org.openjdk.jmh.annotations.Benchmark; 6 | import org.openjdk.jmh.annotations.BenchmarkMode; 7 | import org.openjdk.jmh.annotations.Mode; 8 | import org.openjdk.jmh.annotations.OutputTimeUnit; 9 | import org.openjdk.jmh.annotations.Param; 10 | import org.openjdk.jmh.annotations.Scope; 11 | import org.openjdk.jmh.annotations.Setup; 12 | import org.openjdk.jmh.annotations.State; 13 | import org.openjdk.jmh.infra.Blackhole; 14 | 15 | @BenchmarkMode(Mode.AverageTime) 16 | @OutputTimeUnit(TimeUnit.NANOSECONDS) 17 | @State(Scope.Thread) 18 | public class LoopyBenchmarks { 19 | @Param({ "32", "1024", "32768" }) 20 | int size; 21 | 22 | byte[] bunn; 23 | 24 | @Setup 25 | public void prepare() { 26 | bunn = new byte[size]; 27 | } 28 | 29 | @Benchmark 30 | public void goodOldLoop(Blackhole fox) { 31 | for (int y = 0; y < bunn.length; y++) { // good old C style for (the win?) 32 | fox.consume(bunn[y]); 33 | } 34 | } 35 | 36 | @Benchmark 37 | public void sweetLoop(Blackhole fox) { 38 | for (byte bunny : bunn) { // syntactic sugar loop goodness 39 | fox.consume(bunny); 40 | } 41 | } 42 | 43 | @Benchmark 44 | public void goodOldLoopReturns(Blackhole fox) { 45 | byte[] sunn = bunn; // make a local copy of the field 46 | for (int y = 0; y < sunn.length; y++) { 47 | fox.consume(sunn[y]); 48 | } 49 | } 50 | 51 | @Benchmark 52 | public int sumOldLoop() { 53 | int sum = 0; 54 | for (int y = 0; y < bunn.length; y++) { 55 | sum += bunn[y]; 56 | } 57 | return sum; 58 | } 59 | 60 | @Benchmark 61 | public int sumSweetLoop() { 62 | int sum = 0; 63 | for (byte bunny : bunn) { 64 | sum += bunny; 65 | } 66 | return sum; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/conc/FalseSharingBenchmarkLazySet.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw.conc; 2 | 3 | import java.util.concurrent.atomic.AtomicInteger; 4 | import java.util.concurrent.atomic.AtomicLongArray; 5 | 6 | import org.openjdk.jmh.annotations.Benchmark; 7 | import org.openjdk.jmh.annotations.Scope; 8 | import org.openjdk.jmh.annotations.State; 9 | 10 | public class FalseSharingBenchmarkLazySet { 11 | private final static int LONGS_IN_CACHELINE = Integer.getInteger("longs.in.cacheline", 8); 12 | private final static int NUMBER_OF_THREADS = Integer.getInteger("threads", 32); 13 | private final static AtomicInteger THREAD_INDEX = new AtomicInteger(0); 14 | 15 | @State(Scope.Benchmark) 16 | public static class SharedCounters { 17 | private final AtomicLongArray array = new AtomicLongArray(LONGS_IN_CACHELINE * (NUMBER_OF_THREADS+2)); 18 | } 19 | 20 | @State(Scope.Thread) 21 | public static class ThreadIndex { 22 | /** 23 | * First shared access index points to location which is buffered to the 24 | * left by a cacheline but all others are lined up sequentially causing 25 | * false sharing between them. Last index points to a location which is 26 | * buffered to the right. 27 | */ 28 | private final int falseSharedIndex = LONGS_IN_CACHELINE + THREAD_INDEX.getAndIncrement(); 29 | 30 | /** 31 | * Each index is buffered by a cacheline to it's left and the last by a 32 | * cacheline to the right. 33 | */ 34 | private final int noSharingIndex = LONGS_IN_CACHELINE + (falseSharedIndex - LONGS_IN_CACHELINE) * LONGS_IN_CACHELINE; 35 | } 36 | 37 | @Benchmark 38 | public void measureUnshared(SharedCounters counters, ThreadIndex index) { 39 | long value = counters.array.get(index.noSharingIndex); 40 | counters.array.lazySet(index.noSharingIndex, value + 1); 41 | } 42 | 43 | @Benchmark 44 | public void measureShared(SharedCounters counters, ThreadIndex index) { 45 | long value = counters.array.get(index.falseSharedIndex); 46 | counters.array.lazySet(index.falseSharedIndex, value + 1); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/conc/FalseSharingBenchmarkPlain.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw.conc; 2 | 3 | import java.util.concurrent.atomic.AtomicInteger; 4 | 5 | import org.openjdk.jmh.annotations.Benchmark; 6 | import org.openjdk.jmh.annotations.Scope; 7 | import org.openjdk.jmh.annotations.State; 8 | 9 | public class FalseSharingBenchmarkPlain { 10 | final static int LONGS_IN_CACHELINE = Integer.getInteger("longs.in.cacheline", 8); 11 | final static int NUMBER_OF_THREADS = Integer.getInteger("threads", 32); 12 | final static AtomicInteger THREAD_INDEX = new AtomicInteger(0); 13 | 14 | @State(Scope.Benchmark) 15 | public static class SharedCounters { 16 | private final long[] array = new long[LONGS_IN_CACHELINE * (NUMBER_OF_THREADS + 2)]; 17 | } 18 | 19 | @State(Scope.Thread) 20 | public static class ThreadIndex { 21 | /** 22 | * First shared access index points to location which is buffered to the 23 | * left by a cacheline but all others are lined up sequentially causing 24 | * false sharing between them. Last index points to a location which is 25 | * buffered to the right. 26 | */ 27 | private final int falseSharedIndex = LONGS_IN_CACHELINE + THREAD_INDEX.getAndIncrement(); 28 | 29 | /** 30 | * Each index is buffered by a cacheline to it's left and the last by a 31 | * cacheline to the right. 32 | */ 33 | private final int noSharingIndex = LONGS_IN_CACHELINE + (falseSharedIndex - LONGS_IN_CACHELINE) * LONGS_IN_CACHELINE; 34 | } 35 | 36 | @Benchmark 37 | public void measureUnshared(SharedCounters counters, ThreadIndex index) { 38 | long value = counters.array[index.noSharingIndex]; 39 | counters.array[index.noSharingIndex] = value + 1; 40 | } 41 | 42 | @Benchmark 43 | public void measureShared(SharedCounters counters, ThreadIndex index) { 44 | long value = counters.array[index.falseSharedIndex]; 45 | counters.array[index.falseSharedIndex] = value + 1; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/conc/FalseSharingBenchmarkVolatile.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw.conc; 2 | 3 | import java.util.concurrent.atomic.AtomicInteger; 4 | import java.util.concurrent.atomic.AtomicLongArray; 5 | 6 | import org.openjdk.jmh.annotations.Benchmark; 7 | import org.openjdk.jmh.annotations.Scope; 8 | import org.openjdk.jmh.annotations.State; 9 | 10 | public class FalseSharingBenchmarkVolatile { 11 | private final static int LONGS_IN_CACHELINE = Integer.getInteger("longs.in.cacheline", 8); 12 | private final static int NUMBER_OF_THREADS = Integer.getInteger("threads", 32); 13 | private final static AtomicInteger THREAD_INDEX = new AtomicInteger(0); 14 | 15 | @State(Scope.Benchmark) 16 | public static class SharedCounters { 17 | private final AtomicLongArray array = new AtomicLongArray(LONGS_IN_CACHELINE * (NUMBER_OF_THREADS + 2)); 18 | } 19 | 20 | @State(Scope.Thread) 21 | public static class ThreadIndex { 22 | /** 23 | * First shared access index points to location which is buffered to the 24 | * left by a cacheline but all others are lined up sequentially causing 25 | * false sharing between them. Last index points to a location which is 26 | * buffered to the right. 27 | */ 28 | private final int falseSharedIndex = LONGS_IN_CACHELINE + THREAD_INDEX.getAndIncrement(); 29 | 30 | /** 31 | * Each index is buffered by a cacheline to it's left and the last by a 32 | * cacheline to the right. 33 | */ 34 | private final int noSharingIndex = LONGS_IN_CACHELINE + (falseSharedIndex - LONGS_IN_CACHELINE) 35 | * LONGS_IN_CACHELINE; 36 | } 37 | 38 | @Benchmark 39 | public void measureUnshared(SharedCounters counters, ThreadIndex index) { 40 | long value = counters.array.get(index.noSharingIndex); 41 | counters.array.set(index.noSharingIndex, value + 1); 42 | } 43 | 44 | @Benchmark 45 | public void measureShared(SharedCounters counters, ThreadIndex index) { 46 | long value = counters.array.get(index.falseSharedIndex); 47 | counters.array.set(index.falseSharedIndex, value + 1); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/utf8/CustomUtf8Encoder.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw.utf8; 2 | 3 | import static psy.lob.saw.utf8.UnsafeDirectByteBuffer.getAddress; 4 | import static psy.lob.saw.utf8.UnsafeDirectByteBuffer.putByte; 5 | import static psy.lob.saw.utf8.UnsafeString.getChars; 6 | 7 | import java.nio.ByteBuffer; 8 | import java.nio.charset.CoderResult; 9 | 10 | import sun.nio.cs.Surrogate; 11 | 12 | /** 13 | * Customized version of the JDK7 UTF8 encoder targeting the use-case of encoding strings that should fit into a byte 14 | * buffer. 15 | * 16 | * @author nitsan 17 | */ 18 | public class CustomUtf8Encoder { 19 | // as opposed to the JDK version where this is allocated lazily if required 20 | private final Surrogate.Parser sgp = new Surrogate.Parser(); 21 | // taking these off the stack seems to make it go faster 22 | private int lastSp; 23 | private int lastDp; 24 | 25 | /** 26 | * Encodes a string into the byte buffer using the UTF-8 encoding. Like the JDK encoder this will return UNDERFLOW 27 | * on success and ERROR/OVERFLOW otherwise, but unlike the JDK encode it does not allow resuming the operation and 28 | * will not move the byte buffer position should the string not fit in it. 29 | * 30 | * @param src 31 | * @param dst 32 | * @return 33 | */ 34 | public final CoderResult encodeString(String src, ByteBuffer dst) { 35 | if (dst.hasArray()) 36 | return encodeStringToHeap(src, dst); 37 | else 38 | return encodeStringToDirect(src, dst); 39 | } 40 | 41 | public final CoderResult encodeStringToDirect(String src, ByteBuffer dst) { 42 | lastDp = 0; 43 | int dp = dst.position(); 44 | int dl = dst.limit(); 45 | 46 | /* 47 | * in JDK7 offset is always 0, but earlier versions accomodated substrings pointing back to original array and 48 | * having a separate offset and length. 49 | */ 50 | int spCurr = UnsafeString.getOffset(src); 51 | int sl = src.length(); 52 | 53 | // pluck the chars array out of the String, saving us an array copy 54 | CoderResult result = encode(getChars(src), spCurr, sl, getAddress(dst), dp, dl); 55 | // only move the position if we fit the whole thing in. 56 | if (lastDp != 0) 57 | dst.position(lastDp); 58 | return result; 59 | 60 | } 61 | 62 | /** 63 | * The parameter naming is from the JDK source and I kept it to make diffing easier. The s stands for source, the d 64 | * for destination. It actually grew on me as I played with the code, but I agree longer names are more readable. 65 | * 66 | * @param sa source char array 67 | * @param spCurr the source position starting point 68 | * @param sl source array length/limit 69 | * @param dAddress destination address(plucked out of Buffer using Unsafe) 70 | * @param dp destination position 71 | * @param dl destination limit 72 | * @return UNDERFLOW is successful, OVERFLOW/ERROR otherwise 73 | */ 74 | private final CoderResult encode(char[] sa, int spCurr, int sl, long dAddress, int dp, int dl) { 75 | lastSp = spCurr; 76 | int dlASCII = Math.min(sl - lastSp, dl - dp); 77 | // handle ascii encoded strings in an optimised loop 78 | while (dp < dlASCII && sa[lastSp] < 128) 79 | // TODO: could arguably skip this utility and compute the target address directly... 80 | putByte(dAddress, dp++, (byte) sa[lastSp++]); 81 | 82 | while (lastSp < sl) { 83 | int c = sa[lastSp]; 84 | if (c < 128) { 85 | if (dp >= dl) 86 | return CoderResult.OVERFLOW; 87 | putByte(dAddress, dp++, (byte) c); 88 | } else if (c < 2048) { 89 | if (dl - dp < 2) 90 | return CoderResult.OVERFLOW; 91 | putByte(dAddress, dp++, (byte) (0xC0 | (c >> 6))); 92 | putByte(dAddress, dp++, (byte) (0x80 | (c & 0x3F))); 93 | } else if (Surrogate.is(c)) { 94 | int uc = sgp.parse((char) c, sa, lastSp, sl); 95 | if (uc < 0) { 96 | lastDp = dp; 97 | return sgp.error(); 98 | } 99 | if (dl - dp < 4) 100 | return CoderResult.OVERFLOW; 101 | putByte(dAddress, dp++, (byte) (0xF0 | uc >> 18)); 102 | putByte(dAddress, dp++, (byte) (0x80 | uc >> 12 & 0x3F)); 103 | putByte(dAddress, dp++, (byte) (0x80 | uc >> 6 & 0x3F)); 104 | putByte(dAddress, dp++, (byte) (0x80 | uc & 0x3F)); 105 | ++lastSp; 106 | } else { 107 | if (dl - dp < 3) 108 | return CoderResult.OVERFLOW; 109 | putByte(dAddress, dp++, (byte) (0xE0 | c >> 12)); 110 | putByte(dAddress, dp++, (byte) (0x80 | c >> 6 & 0x3F)); 111 | putByte(dAddress, dp++, (byte) (0x80 | c & 0x3F)); 112 | } 113 | ++lastSp; 114 | } 115 | lastDp = dp; 116 | return CoderResult.UNDERFLOW; 117 | } 118 | 119 | public CoderResult encodeStringToHeap(String src, ByteBuffer dst) { 120 | lastDp = 0; 121 | int arrayOffset = dst.arrayOffset(); 122 | int dp = arrayOffset + dst.position(); 123 | int dl = arrayOffset + dst.limit(); 124 | 125 | int spCurr = UnsafeString.getOffset(src); 126 | int sl = src.length(); 127 | 128 | try { 129 | CoderResult result = encode(UnsafeString.getChars(src), spCurr, sl, dst.array(), dp, dl); 130 | dst.position(lastDp - arrayOffset); 131 | return result; 132 | } catch (ArrayIndexOutOfBoundsException e) { 133 | return CoderResult.OVERFLOW; 134 | } 135 | 136 | } 137 | 138 | private CoderResult encode(char[] sa, int spCurr, int sl, byte[] da, int dp, int dl) { 139 | lastSp = spCurr; 140 | int dlASCII = dp + Math.min(sl - lastSp, dl - dp); 141 | // handle ascii encoded strings in an optimised loop 142 | while (dp < dlASCII && sa[lastSp] < 128) 143 | da[dp++] = (byte) sa[lastSp++]; 144 | 145 | /* 146 | * we are counting on the JVM array boundary checks to throw an exception rather then checking boundaries 147 | * ourselves... no nice, and potentially not that much of a performance enhancement. 148 | */ 149 | while (lastSp < sl) { 150 | int c = sa[lastSp]; 151 | if (c < 128) { 152 | da[dp++] = (byte) c; 153 | } else if (c < 2048) { 154 | da[dp++] = (byte) (0xC0 | (c >> 6)); 155 | da[dp++] = (byte) (0x80 | (c & 0x3F)); 156 | } else if (Surrogate.is(c)) { 157 | int uc = sgp.parse((char) c, sa, lastSp, sl); 158 | if (uc < 0) { 159 | lastDp = dp; 160 | return sgp.error(); 161 | } 162 | da[dp++] = (byte) (0xF0 | uc >> 18); 163 | da[dp++] = (byte) (0x80 | uc >> 12 & 0x3F); 164 | da[dp++] = (byte) (0x80 | uc >> 6 & 0x3F); 165 | da[dp++] = (byte) (0x80 | uc & 0x3F); 166 | ++lastSp; 167 | } else { 168 | da[dp++] = (byte) (0xE0 | c >> 12); 169 | da[dp++] = (byte) (0x80 | c >> 6 & 0x3F); 170 | da[dp++] = (byte) (0x80 | c & 0x3F); 171 | } 172 | ++lastSp; 173 | } 174 | lastDp = dp; 175 | return CoderResult.UNDERFLOW; 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/utf8/UnsafeCharBuffer.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw.utf8; 2 | 3 | import java.nio.Buffer; 4 | import java.nio.CharBuffer; 5 | 6 | import psy.lob.saw.util.UnsafeAccess; 7 | 8 | public class UnsafeCharBuffer { 9 | private static final long hbOffset; 10 | private static final long offsetOffset; 11 | private static final long capacityOffset; 12 | private static final long markOffset; 13 | 14 | static { 15 | try { 16 | hbOffset = UnsafeAccess.UNSAFE.objectFieldOffset(CharBuffer.class 17 | .getDeclaredField("hb")); 18 | offsetOffset = UnsafeAccess.UNSAFE 19 | .objectFieldOffset(CharBuffer.class 20 | .getDeclaredField("offset")); 21 | capacityOffset = UnsafeAccess.UNSAFE.objectFieldOffset(Buffer.class 22 | .getDeclaredField("capacity")); 23 | markOffset = UnsafeAccess.UNSAFE.objectFieldOffset(Buffer.class 24 | .getDeclaredField("mark")); 25 | } catch (Exception e) { 26 | throw new RuntimeException(e); 27 | } 28 | } 29 | 30 | public static void wrap(CharBuffer buffy, char[] chars, int offset, 31 | int length) { 32 | UnsafeAccess.UNSAFE.putObject(buffy, hbOffset, chars); 33 | UnsafeAccess.UNSAFE.putInt(buffy, offsetOffset, 0); // see 34 | // CharBuffer.wrap 35 | // doc 36 | UnsafeAccess.UNSAFE.putInt(buffy, capacityOffset, chars.length); 37 | UnsafeAccess.UNSAFE.putInt(buffy, markOffset, -1); 38 | buffy.position(offset); 39 | buffy.limit(offset + length); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/utf8/UnsafeDirectByteBuffer.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw.utf8; 2 | 3 | import java.nio.Buffer; 4 | import java.nio.ByteBuffer; 5 | import java.nio.ByteOrder; 6 | 7 | import psy.lob.saw.util.UnsafeAccess; 8 | 9 | public class UnsafeDirectByteBuffer { 10 | private static final long addressOffset; 11 | public static final int CACHE_LINE_SIZE = 64; 12 | public static final int PAGE_SIZE = UnsafeAccess.UNSAFE.pageSize(); 13 | static { 14 | try { 15 | addressOffset = UnsafeAccess.UNSAFE.objectFieldOffset(Buffer.class 16 | .getDeclaredField("address")); 17 | } catch (Exception e) { 18 | throw new RuntimeException(e); 19 | } 20 | } 21 | 22 | public static long getAddress(ByteBuffer buffy) { 23 | return UnsafeAccess.UNSAFE.getLong(buffy, addressOffset); 24 | } 25 | 26 | /** 27 | * put byte and skip position update and boundary checks 28 | * 29 | * @param buffy 30 | * @param b 31 | */ 32 | public static void putByte(long address, int position, byte b) { 33 | UnsafeAccess.UNSAFE.putByte(address + position, b); 34 | } 35 | 36 | public static void putByte(long address, byte b) { 37 | UnsafeAccess.UNSAFE.putByte(address, b); 38 | } 39 | 40 | public static ByteBuffer allocateAlignedByteBuffer(int capacity, long align) { 41 | if (Long.bitCount(align) != 1) { 42 | throw new IllegalArgumentException("Alignment must be a power of 2"); 43 | } 44 | // We over allocate by the alignment so we know we can have a large 45 | // enough aligned block of memory to use. 46 | ByteBuffer buffy = ByteBuffer.allocateDirect((int) (capacity + align)); 47 | long address = getAddress(buffy); 48 | if ((address & (align - 1)) == 0) { 49 | // limit to the capacity specified 50 | buffy.limit(capacity); 51 | // set order to native while we are here. 52 | ByteBuffer slice = buffy.slice().order(ByteOrder.nativeOrder()); 53 | // the slice is now an aligned buffer of the required capacity 54 | return slice; 55 | } else { 56 | int newPosition = (int) (align - (address & (align - 1))); 57 | buffy.position(newPosition); 58 | int newLimit = newPosition + capacity; 59 | // limit to the capacity specified 60 | buffy.limit(newLimit); 61 | // set order to native while we are here. 62 | ByteBuffer slice = buffy.slice().order(ByteOrder.nativeOrder()); 63 | // the slice is now an aligned buffer of the required capacity 64 | return slice; 65 | } 66 | } 67 | 68 | public static boolean isPageAligned(ByteBuffer buffy) { 69 | return isPageAligned(getAddress(buffy)); 70 | } 71 | 72 | /** 73 | * This assumes cache line is 64b 74 | */ 75 | public static boolean isCacheAligned(ByteBuffer buffy) { 76 | return isCacheAligned(getAddress(buffy)); 77 | } 78 | 79 | public static boolean isPageAligned(long address) { 80 | return (address & (PAGE_SIZE - 1)) == 0; 81 | } 82 | 83 | /** 84 | * This assumes cache line is 64b 85 | */ 86 | public static boolean isCacheAligned(long address) { 87 | return (address & (CACHE_LINE_SIZE - 1)) == 0; 88 | } 89 | 90 | public static boolean isAligned(long address, long align) { 91 | if (Long.bitCount(align) != 1) { 92 | throw new IllegalArgumentException("Alignment must be a power of 2"); 93 | } 94 | return (address & (align - 1)) == 0; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/utf8/UnsafeString.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw.utf8; 2 | 3 | import java.lang.reflect.Field; 4 | import java.nio.CharBuffer; 5 | 6 | import sun.misc.Unsafe; 7 | 8 | public class UnsafeString { 9 | private static final Unsafe unsafe; 10 | private static final long valueOffset; 11 | private static final long offsetOffset; 12 | private static final long countOffset; 13 | 14 | static { 15 | try { 16 | // This is a bit of voodoo to force the unsafe object into 17 | // visibility and acquire it. 18 | // This is not playing nice, but as an established back door it is 19 | // not likely to be 20 | // taken away. 21 | Field field = Unsafe.class.getDeclaredField("theUnsafe"); 22 | field.setAccessible(true); 23 | unsafe = (Unsafe) field.get(null); 24 | valueOffset = unsafe.objectFieldOffset(String.class 25 | .getDeclaredField("value")); 26 | Field declaredField; 27 | try { 28 | declaredField = String.class.getDeclaredField("count"); 29 | } 30 | // this will happen for jdk7 as these fields have been removed 31 | catch (NoSuchFieldException e) { 32 | declaredField = null; 33 | } 34 | if (declaredField != null) { 35 | countOffset = unsafe.objectFieldOffset(declaredField); 36 | } else { 37 | countOffset = -1L; 38 | } 39 | declaredField = null; 40 | try { 41 | declaredField = String.class.getDeclaredField("offset"); 42 | } 43 | // this will happen for jdk7 as these fields have been removed 44 | catch (NoSuchFieldException e) { 45 | declaredField = null; 46 | } 47 | if (declaredField != null) { 48 | offsetOffset = unsafe.objectFieldOffset(declaredField); 49 | } else { 50 | offsetOffset = -1L; 51 | } 52 | } catch (Exception e) { 53 | throw new RuntimeException(e); 54 | } 55 | } 56 | 57 | public final static String buildUnsafe(char[] chars) { 58 | String mutable = new String();// an empty string to hack 59 | unsafe.putObject(mutable, valueOffset, chars); 60 | if (countOffset != -1L) { 61 | unsafe.putInt(mutable, countOffset, chars.length); 62 | } 63 | return mutable; 64 | } 65 | 66 | public final static String buildUnsafe(char[] chars, int offset, int length) { 67 | String mutable = new String();// an empty string to hack 68 | unsafe.putObject(mutable, valueOffset, chars); 69 | if (countOffset != -1L) { 70 | unsafe.putInt(mutable, countOffset, length); 71 | unsafe.putIntVolatile(mutable, offsetOffset, offset); 72 | } 73 | return mutable; 74 | } 75 | 76 | public final static char[] getChars(String s) { 77 | return (char[]) unsafe.getObject(s, valueOffset); 78 | } 79 | 80 | public final static int getOffset(String s) { 81 | if (offsetOffset == -1L) 82 | return 0; 83 | else 84 | return unsafe.getInt(s, offsetOffset); 85 | } 86 | 87 | public final static CharBuffer getStringAsCharBuffer(String s) { 88 | CharBuffer buffy = CharBuffer.wrap(getChars(s)); 89 | return buffy; 90 | } 91 | 92 | public final static void wrapStringWithCharBuffer(String s, CharBuffer buffy) { 93 | UnsafeCharBuffer.wrap(buffy, getChars(s), 0, s.length()); 94 | } 95 | 96 | public static void main(String[] args) { 97 | String text = buildUnsafe(new char[] { 'W', 'O', 'W' }); 98 | if (text.equals("WOW")) { 99 | System.out.println("WOW"); 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/utf8/Utf8EncodingBenchmark.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw.utf8; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | import java.io.InputStreamReader; 7 | import java.io.Reader; 8 | import java.io.UnsupportedEncodingException; 9 | import java.nio.ByteBuffer; 10 | import java.nio.CharBuffer; 11 | import java.nio.charset.Charset; 12 | import java.nio.charset.CharsetEncoder; 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | import org.openjdk.jmh.annotations.Benchmark; 17 | import org.openjdk.jmh.annotations.Scope; 18 | import org.openjdk.jmh.annotations.Setup; 19 | import org.openjdk.jmh.annotations.State; 20 | 21 | @State(Scope.Thread) 22 | public class Utf8EncodingBenchmark { 23 | // experiment test input 24 | private List strings = new ArrayList(); 25 | 26 | // CharsetEncoder helper buffers 27 | private char[] chars; 28 | private CharBuffer charBuffer; 29 | private CharsetEncoder encoder; 30 | 31 | // My own encoder 32 | private CustomUtf8Encoder customEncoder; 33 | 34 | // Destination buffer, the slayer 35 | private ByteBuffer buffySummers; 36 | 37 | @Setup 38 | public void init() { 39 | boolean useDirectBuffer = Boolean 40 | .getBoolean("Utf8EncodingBenchmark.directBuffer"); 41 | InputStream testTextStream = null; 42 | InputStreamReader inStreamReader = null; 43 | BufferedReader buffReader = null; 44 | try { 45 | testTextStream = getClass().getResourceAsStream("/Utf8Samples.txt"); 46 | inStreamReader = new InputStreamReader(testTextStream, "UTF-8"); 47 | buffReader = new BufferedReader(inStreamReader); 48 | String line; 49 | while ((line = buffReader.readLine()) != null) { 50 | strings.add(line); 51 | } 52 | } catch (Exception e) { 53 | throw new RuntimeException(e); 54 | } finally { 55 | closeStream(testTextStream); 56 | closeReader(inStreamReader); 57 | closeReader(buffReader); 58 | } 59 | 60 | if (useDirectBuffer) { 61 | buffySummers = ByteBuffer.allocateDirect(4096); 62 | } else { 63 | buffySummers = ByteBuffer.allocate(4096); 64 | } 65 | chars = new char[4096]; 66 | charBuffer = CharBuffer.wrap(chars); 67 | encoder = Charset.forName("UTF-8").newEncoder(); 68 | customEncoder = new CustomUtf8Encoder(); 69 | } 70 | 71 | private void closeStream(InputStream inStream) { 72 | if (inStream != null) { 73 | try { 74 | inStream.close(); 75 | } catch (IOException e) { 76 | throw new RuntimeException(e); 77 | } 78 | } 79 | } 80 | 81 | private void closeReader(Reader buffReader) { 82 | if (buffReader != null) { 83 | try { 84 | buffReader.close(); 85 | } catch (IOException e) { 86 | throw new RuntimeException(e); 87 | } 88 | } 89 | } 90 | 91 | @Benchmark 92 | public int customEncoder() { 93 | int countBytes = 0; 94 | for (int stringIndex = 0; stringIndex < strings.size(); stringIndex++) { 95 | customEncoder.encodeString(strings.get(stringIndex), buffySummers); 96 | countBytes += buffySummers.position(); 97 | buffySummers.clear(); 98 | } 99 | return countBytes; 100 | } 101 | 102 | @Benchmark 103 | public int stringGetBytes() throws UnsupportedEncodingException { 104 | int countBytes = 0; 105 | for (int stringIndex = 0; stringIndex < strings.size(); stringIndex++) { 106 | buffySummers.put(strings.get(stringIndex).getBytes("UTF-8")); 107 | countBytes += buffySummers.position(); 108 | buffySummers.clear(); 109 | } 110 | return countBytes; 111 | } 112 | 113 | @Benchmark 114 | public int charsetEncoder() throws UnsupportedEncodingException { 115 | int countBytes = 0; 116 | for (int stringIndex = 0; stringIndex < strings.size(); stringIndex++) { 117 | String source = strings.get(stringIndex); 118 | int length = source.length(); 119 | source.getChars(0, length, chars, 0); 120 | charBuffer.position(0); 121 | charBuffer.limit(length); 122 | encoder.reset(); 123 | encoder.encode(charBuffer, buffySummers, true); 124 | countBytes += buffySummers.position(); 125 | buffySummers.clear(); 126 | } 127 | return countBytes; 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /src/main/java/psy/lob/saw/util/UnsafeAccess.java: -------------------------------------------------------------------------------- 1 | package psy.lob.saw.util; 2 | 3 | import java.lang.reflect.Field; 4 | 5 | import sun.misc.Unsafe; 6 | 7 | public class UnsafeAccess { 8 | public static final Unsafe UNSAFE; 9 | static { 10 | try { 11 | Field field = Unsafe.class.getDeclaredField("theUnsafe"); 12 | field.setAccessible(true); 13 | UNSAFE = (Unsafe) field.get(null); 14 | } catch (Exception e) { 15 | throw new RuntimeException(e); 16 | } 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/resources/LICENSE: -------------------------------------------------------------------------------- 1 | The GNU General Public License (GPL) 2 | 3 | Version 2, June 1991 4 | 5 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. 6 | 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 7 | 8 | Everyone is permitted to copy and distribute verbatim copies of this license 9 | document, but changing it is not allowed. 10 | 11 | Preamble 12 | 13 | The licenses for most software are designed to take away your freedom to share 14 | and change it. By contrast, the GNU General Public License is intended to 15 | guarantee your freedom to share and change free software--to make sure the 16 | software is free for all its users. This General Public License applies to 17 | most of the Free Software Foundation's software and to any other program whose 18 | authors commit to using it. (Some other Free Software Foundation software is 19 | covered by the GNU Library General Public License instead.) You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not price. Our 23 | General Public Licenses are designed to make sure that you have the freedom to 24 | distribute copies of free software (and charge for this service if you wish), 25 | that you receive source code or can get it if you want it, that you can change 26 | the software or use pieces of it in new free programs; and that you know you 27 | can do these things. 28 | 29 | To protect your rights, we need to make restrictions that forbid anyone to deny 30 | you these rights or to ask you to surrender the rights. These restrictions 31 | translate to certain responsibilities for you if you distribute copies of the 32 | software, or if you modify it. 33 | 34 | For example, if you distribute copies of such a program, whether gratis or for 35 | a fee, you must give the recipients all the rights that you have. You must 36 | make sure that they, too, receive or can get the source code. And you must 37 | show them these terms so they know their rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and (2) 40 | offer you this license which gives you legal permission to copy, distribute 41 | and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain that 44 | everyone understands that there is no warranty for this free software. If the 45 | software is modified by someone else and passed on, we want its recipients to 46 | know that what they have is not the original, so that any problems introduced 47 | by others will not reflect on the original authors' reputations. 48 | 49 | Finally, any free program is threatened constantly by software patents. We 50 | wish to avoid the danger that redistributors of a free program will 51 | individually obtain patent licenses, in effect making the program proprietary. 52 | To prevent this, we have made it clear that any patent must be licensed for 53 | everyone's free use or not licensed at all. 54 | 55 | The precise terms and conditions for copying, distribution and modification 56 | follow. 57 | 58 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 59 | 60 | 0. This License applies to any program or other work which contains a notice 61 | placed by the copyright holder saying it may be distributed under the terms of 62 | this General Public License. The "Program", below, refers to any such program 63 | or work, and a "work based on the Program" means either the Program or any 64 | derivative work under copyright law: that is to say, a work containing the 65 | Program or a portion of it, either verbatim or with modifications and/or 66 | translated into another language. (Hereinafter, translation is included 67 | without limitation in the term "modification".) Each licensee is addressed as 68 | "you". 69 | 70 | Activities other than copying, distribution and modification are not covered by 71 | this License; they are outside its scope. The act of running the Program is 72 | not restricted, and the output from the Program is covered only if its contents 73 | constitute a work based on the Program (independent of having been made by 74 | running the Program). Whether that is true depends on what the Program does. 75 | 76 | 1. You may copy and distribute verbatim copies of the Program's source code as 77 | you receive it, in any medium, provided that you conspicuously and 78 | appropriately publish on each copy an appropriate copyright notice and 79 | disclaimer of warranty; keep intact all the notices that refer to this License 80 | and to the absence of any warranty; and give any other recipients of the 81 | Program a copy of this License along with the Program. 82 | 83 | You may charge a fee for the physical act of transferring a copy, and you may 84 | at your option offer warranty protection in exchange for a fee. 85 | 86 | 2. You may modify your copy or copies of the Program or any portion of it, thus 87 | forming a work based on the Program, and copy and distribute such modifications 88 | or work under the terms of Section 1 above, provided that you also meet all of 89 | these conditions: 90 | 91 | a) You must cause the modified files to carry prominent notices stating 92 | that you changed the files and the date of any change. 93 | 94 | b) You must cause any work that you distribute or publish, that in whole or 95 | in part contains or is derived from the Program or any part thereof, to be 96 | licensed as a whole at no charge to all third parties under the terms of 97 | this License. 98 | 99 | c) If the modified program normally reads commands interactively when run, 100 | you must cause it, when started running for such interactive use in the 101 | most ordinary way, to print or display an announcement including an 102 | appropriate copyright notice and a notice that there is no warranty (or 103 | else, saying that you provide a warranty) and that users may redistribute 104 | the program under these conditions, and telling the user how to view a copy 105 | of this License. (Exception: if the Program itself is interactive but does 106 | not normally print such an announcement, your work based on the Program is 107 | not required to print an announcement.) 108 | 109 | These requirements apply to the modified work as a whole. If identifiable 110 | sections of that work are not derived from the Program, and can be reasonably 111 | considered independent and separate works in themselves, then this License, and 112 | its terms, do not apply to those sections when you distribute them as separate 113 | works. But when you distribute the same sections as part of a whole which is a 114 | work based on the Program, the distribution of the whole must be on the terms 115 | of this License, whose permissions for other licensees extend to the entire 116 | whole, and thus to each and every part regardless of who wrote it. 117 | 118 | Thus, it is not the intent of this section to claim rights or contest your 119 | rights to work written entirely by you; rather, the intent is to exercise the 120 | right to control the distribution of derivative or collective works based on 121 | the Program. 122 | 123 | In addition, mere aggregation of another work not based on the Program with the 124 | Program (or with a work based on the Program) on a volume of a storage or 125 | distribution medium does not bring the other work under the scope of this 126 | License. 127 | 128 | 3. You may copy and distribute the Program (or a work based on it, under 129 | Section 2) in object code or executable form under the terms of Sections 1 and 130 | 2 above provided that you also do one of the following: 131 | 132 | a) Accompany it with the complete corresponding machine-readable source 133 | code, which must be distributed under the terms of Sections 1 and 2 above 134 | on a medium customarily used for software interchange; or, 135 | 136 | b) Accompany it with a written offer, valid for at least three years, to 137 | give any third party, for a charge no more than your cost of physically 138 | performing source distribution, a complete machine-readable copy of the 139 | corresponding source code, to be distributed under the terms of Sections 1 140 | and 2 above on a medium customarily used for software interchange; or, 141 | 142 | c) Accompany it with the information you received as to the offer to 143 | distribute corresponding source code. (This alternative is allowed only 144 | for noncommercial distribution and only if you received the program in 145 | object code or executable form with such an offer, in accord with 146 | Subsection b above.) 147 | 148 | The source code for a work means the preferred form of the work for making 149 | modifications to it. For an executable work, complete source code means all 150 | the source code for all modules it contains, plus any associated interface 151 | definition files, plus the scripts used to control compilation and installation 152 | of the executable. However, as a special exception, the source code 153 | distributed need not include anything that is normally distributed (in either 154 | source or binary form) with the major components (compiler, kernel, and so on) 155 | of the operating system on which the executable runs, unless that component 156 | itself accompanies the executable. 157 | 158 | If distribution of executable or object code is made by offering access to copy 159 | from a designated place, then offering equivalent access to copy the source 160 | code from the same place counts as distribution of the source code, even though 161 | third parties are not compelled to copy the source along with the object code. 162 | 163 | 4. You may not copy, modify, sublicense, or distribute the Program except as 164 | expressly provided under this License. Any attempt otherwise to copy, modify, 165 | sublicense or distribute the Program is void, and will automatically terminate 166 | your rights under this License. However, parties who have received copies, or 167 | rights, from you under this License will not have their licenses terminated so 168 | long as such parties remain in full compliance. 169 | 170 | 5. You are not required to accept this License, since you have not signed it. 171 | However, nothing else grants you permission to modify or distribute the Program 172 | or its derivative works. These actions are prohibited by law if you do not 173 | accept this License. Therefore, by modifying or distributing the Program (or 174 | any work based on the Program), you indicate your acceptance of this License to 175 | do so, and all its terms and conditions for copying, distributing or modifying 176 | the Program or works based on it. 177 | 178 | 6. Each time you redistribute the Program (or any work based on the Program), 179 | the recipient automatically receives a license from the original licensor to 180 | copy, distribute or modify the Program subject to these terms and conditions. 181 | You may not impose any further restrictions on the recipients' exercise of the 182 | rights granted herein. You are not responsible for enforcing compliance by 183 | third parties to this License. 184 | 185 | 7. If, as a consequence of a court judgment or allegation of patent 186 | infringement or for any other reason (not limited to patent issues), conditions 187 | are imposed on you (whether by court order, agreement or otherwise) that 188 | contradict the conditions of this License, they do not excuse you from the 189 | conditions of this License. If you cannot distribute so as to satisfy 190 | simultaneously your obligations under this License and any other pertinent 191 | obligations, then as a consequence you may not distribute the Program at all. 192 | For example, if a patent license would not permit royalty-free redistribution 193 | of the Program by all those who receive copies directly or indirectly through 194 | you, then the only way you could satisfy both it and this License would be to 195 | refrain entirely from distribution of the Program. 196 | 197 | If any portion of this section is held invalid or unenforceable under any 198 | particular circumstance, the balance of the section is intended to apply and 199 | the section as a whole is intended to apply in other circumstances. 200 | 201 | It is not the purpose of this section to induce you to infringe any patents or 202 | other property right claims or to contest validity of any such claims; this 203 | section has the sole purpose of protecting the integrity of the free software 204 | distribution system, which is implemented by public license practices. Many 205 | people have made generous contributions to the wide range of software 206 | distributed through that system in reliance on consistent application of that 207 | system; it is up to the author/donor to decide if he or she is willing to 208 | distribute software through any other system and a licensee cannot impose that 209 | choice. 210 | 211 | This section is intended to make thoroughly clear what is believed to be a 212 | consequence of the rest of this License. 213 | 214 | 8. If the distribution and/or use of the Program is restricted in certain 215 | countries either by patents or by copyrighted interfaces, the original 216 | copyright holder who places the Program under this License may add an explicit 217 | geographical distribution limitation excluding those countries, so that 218 | distribution is permitted only in or among countries not thus excluded. In 219 | such case, this License incorporates the limitation as if written in the body 220 | of this License. 221 | 222 | 9. The Free Software Foundation may publish revised and/or new versions of the 223 | General Public License from time to time. Such new versions will be similar in 224 | spirit to the present version, but may differ in detail to address new problems 225 | or concerns. 226 | 227 | Each version is given a distinguishing version number. If the Program 228 | specifies a version number of this License which applies to it and "any later 229 | version", you have the option of following the terms and conditions either of 230 | that version or of any later version published by the Free Software Foundation. 231 | If the Program does not specify a version number of this License, you may 232 | choose any version ever published by the Free Software Foundation. 233 | 234 | 10. If you wish to incorporate parts of the Program into other free programs 235 | whose distribution conditions are different, write to the author to ask for 236 | permission. For software which is copyrighted by the Free Software Foundation, 237 | write to the Free Software Foundation; we sometimes make exceptions for this. 238 | Our decision will be guided by the two goals of preserving the free status of 239 | all derivatives of our free software and of promoting the sharing and reuse of 240 | software generally. 241 | 242 | NO WARRANTY 243 | 244 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR 245 | THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE 246 | STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE 247 | PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 248 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 249 | FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND 250 | PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, 251 | YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 252 | 253 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL 254 | ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE 255 | PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 256 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR 257 | INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA 258 | BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 259 | FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER 260 | OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 261 | 262 | END OF TERMS AND CONDITIONS 263 | 264 | How to Apply These Terms to Your New Programs 265 | 266 | If you develop a new program, and you want it to be of the greatest possible 267 | use to the public, the best way to achieve this is to make it free software 268 | which everyone can redistribute and change under these terms. 269 | 270 | To do so, attach the following notices to the program. It is safest to attach 271 | them to the start of each source file to most effectively convey the exclusion 272 | of warranty; and each file should have at least the "copyright" line and a 273 | pointer to where the full notice is found. 274 | 275 | One line to give the program's name and a brief idea of what it does. 276 | 277 | Copyright (C) 278 | 279 | This program is free software; you can redistribute it and/or modify it 280 | under the terms of the GNU General Public License as published by the Free 281 | Software Foundation; either version 2 of the License, or (at your option) 282 | any later version. 283 | 284 | This program is distributed in the hope that it will be useful, but WITHOUT 285 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 286 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 287 | more details. 288 | 289 | You should have received a copy of the GNU General Public License along 290 | with this program; if not, write to the Free Software Foundation, Inc., 59 291 | Temple Place, Suite 330, Boston, MA 02111-1307 USA 292 | 293 | Also add information on how to contact you by electronic and paper mail. 294 | 295 | If the program is interactive, make it output a short notice like this when it 296 | starts in an interactive mode: 297 | 298 | Gnomovision version 69, Copyright (C) year name of author Gnomovision comes 299 | with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free 300 | software, and you are welcome to redistribute it under certain conditions; 301 | type 'show c' for details. 302 | 303 | The hypothetical commands 'show w' and 'show c' should show the appropriate 304 | parts of the General Public License. Of course, the commands you use may be 305 | called something other than 'show w' and 'show c'; they could even be 306 | mouse-clicks or menu items--whatever suits your program. 307 | 308 | You should also get your employer (if you work as a programmer) or your school, 309 | if any, to sign a "copyright disclaimer" for the program, if necessary. Here 310 | is a sample; alter the names: 311 | 312 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 313 | 'Gnomovision' (which makes passes at compilers) written by James Hacker. 314 | 315 | signature of Ty Coon, 1 April 1989 316 | 317 | Ty Coon, President of Vice 318 | 319 | This General Public License does not permit incorporating your program into 320 | proprietary programs. If your program is a subroutine library, you may 321 | consider it more useful to permit linking proprietary applications with the 322 | library. If this is what you want to do, use the GNU Library General Public 323 | License instead of this License. 324 | 325 | 326 | "CLASSPATH" EXCEPTION TO THE GPL 327 | 328 | Certain source files distributed by Oracle America and/or its affiliates are 329 | subject to the following clarification and special exception to the GPL, but 330 | only where Oracle has expressly included in the particular source file's header 331 | the words "Oracle designates this particular file as subject to the "Classpath" 332 | exception as provided by Oracle in the LICENSE file that accompanied this code." 333 | 334 | Linking this library statically or dynamically with other modules is making 335 | a combined work based on this library. Thus, the terms and conditions of 336 | the GNU General Public License cover the whole combination. 337 | 338 | As a special exception, the copyright holders of this library give you 339 | permission to link this library with independent modules to produce an 340 | executable, regardless of the license terms of these independent modules, 341 | and to copy and distribute the resulting executable under terms of your 342 | choice, provided that you also meet, for each linked independent module, 343 | the terms and conditions of the license of that module. An independent 344 | module is a module which is not derived from or based on this library. If 345 | you modify this library, you may extend this exception to your version of 346 | the library, but you are not obligated to do so. If you do not wish to do 347 | so, delete this exception statement from your version. 348 | -------------------------------------------------------------------------------- /src/main/resources/Utf8Samples.txt: -------------------------------------------------------------------------------- 1 | Kon nie 'n tydelike lêer skep vir storing van: %s 2 | Wil jy hê ek moet probeer om die muis-konfigurasieprogram te laat loop? Neem kennis datjy die stamwagwoord hiervoor nodig het. 3 | Verifiëringsbewysruiling vir gebruiker %s het gefaal 4 | Moenie woorde oor twee reëls _opbreek nie 5 | Seçili Körpü 6 | AtkHyperlink cisminin seçildiyini bildirir 7 | Lövbər Sayı 8 | AtkHyperlink cismi ilə əlaqələndirilmiş lövbər ədədini bildirir. 9 | Son indeks 10 | AtkHyperlink cisminin son indeksi 11 | Başlanğıc indeksi 12 | AtkHyperlink cisminin başlanğıc indeksi 13 | hökmsüz 14 | sür'ətləndirici etiketi 15 | xəbərdarlıq 16 | animasiya 17 | ox 18 | təqvim 19 | kanvas 20 | işarələmə qutusu 21 | işarələmə menyusu üzvü 22 | rəng seçicisi 23 | sütun başlığı 24 | kombo qutusu 25 | tarix editoru 26 | masa üstü timsalı 27 | masa üstü çərçivəsi 28 | zəng-et 29 | dialoq 30 | cərgə lövhəsi 31 | rəsm sahəsi 32 | fayl seçicisi 33 | doldurucu 34 | yazı növü seçicisi 35 | çərçivə 36 | ayna lövhəsi 37 | html konteyneri 38 | timsal 39 | şəkil 40 | daxili çərçivə 41 | etiket 42 | laylanmış lövhə 43 | siyahı 44 | siyahı üzvü 45 | menyu 46 | menyu çubuğu 47 | menyu üzvü 48 | seçim lövhəsi 49 | səhifə səkməsi 50 | səhifə səkməsi siyahısı 51 | panel 52 | şifrə mətni 53 | popup menyu 54 | ilərləmə çubuğu 55 | basma düyməsi 56 | qərar düyməsi 57 | qərar menyusu üzvü 58 | kök lövhə 59 | sətir başlığı 60 | sürüşdürmə çubuğu 61 | sürüşdürmə lövhəsi 62 | ayırıcı 63 | sürüşdürücü 64 | ayırma lövhəsi 65 | dönən düymə 66 | vəziyyət-çubuğu 67 | cədvəl 68 | cədvəl hücrəsi 69 | cədvəl sütun başlığı 70 | cədvəl sətir başlığı 71 | qopardıla bilən menyu üzvü 72 | terminal 73 | mətn 74 | keçiş düyməsi 75 | vasitə çubuğu 76 | məsləhət 77 | ağac 78 | budaq cədvəli 79 | namə'lum 80 | nümayiş-lövhəsi 81 | pəncərə 82 | başlıq 83 | altlıq 84 | paraqraf 85 | tə'minat 86 | avtomatik tamamlama 87 | düzəlişlər çubuğu 88 | daxili tərkib hissəsi 89 | Yetişilə Bilən Ad 90 | Yardımçı texnologiyalara yetişmə üçün şəkilləndilirmiş cismin adı 91 | Yetişilə Bilən İzahat 92 | Yardımçı texnologiyalara yetişmə üçün şəkilləndilirmiş cismin izahatı 93 | Yetişilə Bilən Valideyn 94 | Valideynin dəyişildiyini bildirmək üçün işlədilir 95 | Yetişilə Bilən Qiymət 96 | Qiymətin dəyişildiyini bildirmək üçün işlədilir 97 | Yetişilə Bilən Rol 98 | Bu üzvün yetişilə bilən rolu 99 | Yetişilə Bilən Lay 100 | Bu üzvün yetişilə bilən layı 101 | Yetişilə Bilən MDI Qiyməti 102 | Bu üzvün yetişilə bilən MDI qiyməti 103 | Yetişilə Bilən Cədvəl Etiketi 104 | Cədvəl etiket 105 | Вылучаная спасылка 106 | Задае, ці зьяўляецца аб'ект AtkHyperlink вылучаным 107 | Колькасьць якараў 108 | Колькасьць якараў, якія зьвязаныя з аб'ектам AtkHyperlink 109 | Канцавы індэкс 110 | Канцавы індэкс аб'екту AtkHyperlink 111 | Пачатковы індэкс 112 | Пачатковы індэкс аб'екту AtkHyperlink 113 | нерэчаіснае 114 | адмеціна паскаральніку 115 | сыгнал 116 | анімацыя 117 | стрэлка 118 | каляндар 119 | канва 120 | кнопка-пазначальнік 121 | пункт-пазначальнік мэню 122 | абіральнік колеру 123 | загаловак слупку 124 | камбінаваны элемэнт 125 | рэдактар даты 126 | значка стальцу 127 | кадар стальцу 128 | лічбавае табло 129 | дыялёг 130 | акно тэчкі 131 | прастора маляваньня 132 | абіральнік файлу 133 | фільтар 134 | абіральнік шрыфту 135 | кадар 136 | акно празрыстасьці 137 | кантэйнэр html 138 | значка 139 | відарыс 140 | унутраны кадар 141 | адмеціна 142 | акно узроўняў 143 | сьпіс 144 | пункт сьпісу 145 | мэню 146 | радок мэню 147 | пункт мэню 148 | акно выбараў 149 | ўкладка старонкі 150 | сьпіс ўкладак старонкі 151 | панэль 152 | тэкст паролю 153 | усплыўное мэню 154 | палоска посьпеху 155 | кнопка націску 156 | кнопка ўзаемавыключнага выбару 157 | пункт мэню ўзаемавыключнага выбару 158 | карэннае акно 159 | загаловак радку 160 | паласа пракруткі 161 | акно пракруткі 162 | дзельнік 163 | паўзунок 164 | дзельнік вокнаў 165 | пракрутка 166 | радок стану 167 | табліца 168 | ячэя табліцы 169 | загаловак слупку табліцы 170 | загаловак радку табліцы 171 | пункт зачапленьня мэню 172 | тэрмінал 173 | тэкст 174 | пераключальнік 175 | панэль сродкаў 176 | падказка 177 | дрэва 178 | табліца дрэва 179 | невядома 180 | акно прагляду 181 | акно 182 | загаловак 183 | ніжняя частка акна 184 | абзац 185 | дастасаваньне 186 | аўтазавяршэньне 187 | радок рэдагаваньня 188 | убудаваны кампанэнт 189 | Даступная назва 190 | Назва экзэмпляру аб'екту, фарматаваная для тэхналёгіі садзеяньня 191 | Апісаньне даступнасьці 192 | Апісаньне аб'екта, фарматаванае для тэхналёгіі садзеяньня 193 | Даступнасьць бацькоўскага аб'екту 194 | Выкарыстоўваецца, каб паведамляць пра зьмены бацькоўскага аб'екту 195 | Значэньне даступнасьці 196 | Выкарыстоўваецца, каб паведамляць пра зьмену значэньня 197 | Роля даступнасьці 198 | Роля аб'екту ў даступнасьці 199 | Узровень даступнасьці 200 | Узровень даступнасьці гэтага 201 | Избрана препратка 202 | Определя дали обектът AtkHyperlink е избран 203 | Брой котви 204 | Броят на котвите свързани с обект AtkHyperlink 205 | Край на индекс 206 | Крайният индекс на обект AtkHyperlink 207 | Начало на индекс 208 | Началният индекс на обект AtkHyperlink 209 | невалидно 210 | надпис на ускорител 211 | внимание 212 | анимация 213 | стрелка 214 | календар 215 | платно 216 | кутийка за отмятане 217 | елемент на менюто за отмятане 218 | избор на цвят 219 | заглавие на колона 220 | кутийка за избор от определени стойности 221 | редактор на дата 222 | икона за работния плот 223 | рамка на работния плот 224 | скала 225 | диалогова кутия 226 | изглед към папки 227 | област за рисуване 228 | избор на файл 229 | пълнител 230 | избор на шрифт 231 | рамка 232 | най-горна рамка 233 | контейнер с код на html 234 | икона 235 | картина 236 | вътрешна рамка 237 | етикет 238 | рамка със слоеве обекти 239 | списък 240 | елемент на списък 241 | меню 242 | лента с менюта 243 | елемент от меню 244 | панел с опции 245 | таб за страница 246 | списък с табове 247 | панел 248 | текстово поле за парола 249 | изскачащо меню 250 | лента за прогрес 251 | бутон 252 | радио-бутон 253 | радио-елемент от меню 254 | основна рамка 255 | заглавие на ред 256 | лента за прелистване 257 | рамка, която се прелиства 258 | разделител 259 | плъзгач 260 | разделителна рамка 261 | бутон за последователен избор 262 | лента за състояние 263 | таблица 264 | клетка от таблица 265 | заглавие на колона в таблица 266 | заглавие на ред в таблица 267 | елемент на менюто, който може да се отдели от него 268 | терминал 269 | текст 270 | превключващ бутон 271 | лента с инструменти 272 | подсказка 273 | дърво 274 | дървовидна таблица 275 | непознато 276 | изглед 277 | прозорец 278 | горен колонтитул 279 | долен колонтитул 280 | абзац 281 | приложение 282 | автоматично довършване 283 | лента за редакция 284 | вграден компонент 285 | Достъпно име 286 | Име на обект от някакъв клас. Името е форматирано за технологии за достъпност 287 | Достъпно описание 288 | Описание на обект, форматиран за технологии за достъпност 289 | Достъпен родител 290 | Използва се, за да уведоми за промяна в родителя 291 | Достъпна стойност 292 | Използва се, за да се уведоми за промяна на стойността 293 | 294 | Izabrani link 295 | Označava da li je izabran objekt AtkHyperlink 296 | Broj sidara 297 | Broj sidara združenih s objektom AtkHyperlink 298 | Završni indeks 299 | Završni indeks objekta AtkHyperlink 300 | Početni indeks 301 | Početni indeks objekta AtkHyperlink 302 | nevažeće 303 | oznaka akceleratora 304 | uzbuna 305 | animacija 306 | strelica 307 | kalendar 308 | kanafas 309 | okvir za izbor 310 | stavka menija za izbor 311 | birač boja 312 | zaglavlje kolone 313 | kombinovani okvir 314 | editor datuma 315 | desktop ikona 316 | okvir za desktop 317 | biranje broja 318 | dijalog 319 | okno za direktorije 320 | područje za crtanje 321 | birač datoteka 322 | punjač 323 | birač fontova 324 | okvir 325 | stakleno okno 326 | html spremište 327 | ikona 328 | slika 329 | interni okvir 330 | oznaka 331 | okno sa slojevima 332 | lista 333 | stavka liste 334 | meni 335 | traka menija 336 | stavka menija 337 | okno za opcije 338 | kartica 339 | lista kartica 340 | panel 341 | tekst šifre 342 | popup meni 343 | traka napredovanja 344 | dugme 345 | radio dugme 346 | stavka radio menija 347 | glavno okno 348 | zaglavlje reda 349 | traka s klizačem 350 | okno sa klizačem 351 | linija razdvajanja 352 | klizač 353 | razdijeljeno okno 354 | spin dugme 355 | statusna traka 356 | tablica 357 | polje tablice 358 | zaglavlje kolone tablice 359 | zaglavlje reda tablice 360 | odvojiva stavka menija 361 | terminal 362 | tekst 363 | dugme prekidač 364 | traka s alatima 365 | opis alata 366 | stablo 367 | tablica stabla 368 | nepoznato 369 | port pregleda 370 | prozor 371 | zaglavlje 372 | tekst na dnu 373 | paragraf 374 | aplikacija 375 | samodopuna 376 | traka za izmjene 377 | ugrađena komponenta 378 | Dostupno ime 379 | Ime primjerka objekta je formatirano za dostup uz pomoćnu tehnologiju 380 | Dostupan opis 381 | Opis objekta, formatiran za dostup uz pomoćnu tehnologiju 382 | Dostupno porijeklo 383 | Koristi se za obavijest o promjeni porijekla 384 | Dostupna vrijednost 385 | Koristi se za obavijest o promjeni vrijednosti 386 | Dostupna uloga 387 | Dostupna uloga ovog objekta 388 | Dostupan sloj 389 | Dostupan sloj ovog objekta 390 | Dostupna MDI vrijednost 391 | Dostupna MDI vrijednost ovog objekta 392 | Dostupan natpis tablice 393 | Koristi se za obavijest o promjeni natpisa tablice. Ova osobina se ne bi trebala 394 | Pot ser voleu actualitzar a una versió nova del sistema %s 395 | Seleccioneu el producte per a l'informe d'error. 396 | Escolliu un component, versió, i nivell de gravetat per al producte %s 397 | Seleccioneu una aplicació per a l'informe d'error. 398 | Escolliu un component, versió, i nivell de gravetat per a l'aplicació %s 399 | Aquesta aplicació té informació d'error, però Bug Buddy no sap res d'ella. Seleccioneu una altra aplicació. 400 | Heu d'indicar el component a què es refereix l'informe d'error. 401 | Nom de l'informador de l'error 402 | Adreça electrònica 403 | Adreça de correu amb la qual enviar errors al Bugzilla del GNOME. Aquesta adreça s'utilitzarà per a la correspondència relacionada amb l'error que esteu enviant. Si ja teniu un compte al Bugzilla del GNOME, utilitzeu-la com la vostra adreça de correu. 404 | Fitxer on desar els informes d'error 405 | Fitxer on voleu desar el vostre informe d'error per a enviar-lo més tard. 406 | Última vegada que Bug Buddy va comprovar si hi ha actualitzacions 407 | Camí al vostre sistema de fitxers local on es troba sendmail o un d'equivalent. 408 | Camí al programa de correu semblant a sendmail 409 | Nom real de l'usuari que està enviant l'informe d'error. 410 | Aquesta és l'última vegada (marca de temps UNIX) que Bug Buddy va comprovar si hi havien actualitzacions de la informació de Bugzilla. 411 | Utilitza sendmail per a enviar els informes d'error al Bugzilla del GNOME. És l'únic mètode suportat per ara. 412 | Utilitza sendmail per a enviar informes d'error 413 | Vybraný odkaz 414 | Určuje, jestli je objekt AtkHyperlink vybrán 415 | Počet ukotvení 416 | Počet ukotvení asociovaných s objektem AtkHyperlink 417 | Index konce 418 | Index konce objektu AtkHyperlink 419 | Index začátku 420 | Indek začátku objektu AtkHyperlink 421 | neplatný 422 | popisek klávesové zkratky 423 | upozornění 424 | animace 425 | šipka 426 | kalendář 427 | plátno 428 | zaškrtávací políčko 429 | zaškrtávací položka menu 430 | výběr barvy 431 | záhlaví sloupce 432 | kombo box 433 | editor data 434 | ikona pracovní plochy 435 | rám pracovní plochy 436 | vytáčení 437 | dialog 438 | panel adresářů 439 | kreslicí oblast 440 | výběr souboru 441 | plnič 442 | výběr písma 443 | rám 444 | skleněný panel 445 | kontejner html 446 | ikona 447 | obrázek 448 | interní rám 449 | popisek 450 | vrstvený panel 451 | seznam 452 | položka seznamu 453 | menu 454 | lišta menu 455 | položka menu 456 | panel voleb 457 | záložka stránky 458 | seznam záložek stránky 459 | panel 460 | text hesla 461 | vyskakovací menu 462 | lišta průběhu 463 | tlačítko 464 | rádiové tlačítko 465 | rádiová položka menu 466 | kořenový panel 467 | záhlaví řádku 468 | posuvná lišta 469 | posuvný panel 470 | oddělovač 471 | posunovač 472 | oddělený panel 473 | otáčecí tlačítko 474 | stavová-lišta 475 | tabulka 476 | buňka tabulky 477 | záhlaví sloupce tabulky 478 | záhlaví řádku tabulky 479 | odtrhávací položka menu 480 | terminál 481 | text 482 | přepínač 483 | nástrojová lišta 484 | tip 485 | strom 486 | stromová tabulka 487 | neznámý 488 | pohled 489 | okno 490 | záhlaví 491 | zápatí 492 | odstavec 493 | aplikace 494 | autodoplnění 495 | lišta úprav 496 | vložená komponenta 497 | Zpřístupněný název 498 | Název instance objektu formátovaný pro použití technologiemi zpřístupnění 499 | Zpřístupněný popis 500 | Popis objektu formátovaný pro použití technologiemi zpřístupnění 501 | Zpřístupněný rodič 502 | Používá se pro upozornění, že rodič byl změněn 503 | Zpřístupněná hodnota 504 | Používá se pro upozornění, že hodnota byla změněna 505 | Zpřístupněná role 506 | Zpřístupněná role tohoto objektu 507 | Zpřístupněná vrstva 508 | Zpřístupněná vrstva tohoto objektu 509 | Zpřístupněná hodnota MDI 510 | Zpřístupněná hodnota MDI tohoto objektu 511 | Zpřístupněný nadpis tabulky 512 | Používá se pro upozornění, že nadpis tabulky byl změn 513 | Valgt henvisning 514 | Angiver om AtkHyperlink-objektet er valgt 515 | Antal ankre 516 | Antallet af ankre der er associeret med AtkHyperlink-objektet 517 | Slutindeks 518 | Slutindeks for AtkHyperlink-objektet 519 | Startindeks 520 | Startindeks for AtkHyperlink-objektet 521 | ugyldig 522 | genvejsetiket 523 | advarsel 524 | animation 525 | pil 526 | kalender 527 | lærred 528 | afkrydsningsboks 529 | afkrydsningsmenupunkt 530 | farvevælger 531 | kolonnetitel 532 | kombinationsboks 533 | datoredigering 534 | skrivebordsikon 535 | skrivebordsramme 536 | opkald 537 | vindue 538 | mappepanel 539 | tegneområde 540 | filvælger 541 | udfylder 542 | skrifttypevælger 543 | ramme 544 | glaspanel 545 | html-beholder 546 | ikon 547 | billede 548 | intern ramme 549 | etiket 550 | lagdelt panel 551 | liste 552 | listepunkt 553 | menu 554 | menulinje 555 | menupunkt 556 | indstillingspanel 557 | sidefane 558 | sidefaneliste 559 | panel 560 | adgangskodetekst 561 | pop-op-menu 562 | fremgangslinje 563 | trykknap 564 | radioknap 565 | radiomenupunkt 566 | rodpanel 567 | rækketitel 568 | rulleskakt 569 | rullepanel 570 | adskiller 571 | skyder 572 | delt panel 573 | talindtastning 574 | statuslinje 575 | tabel 576 | tabelcelle 577 | tabelkolonnetitel 578 | tabelrækketitel 579 | afrivningsmenupunkt 580 | terminal 581 | tekst 582 | skifteknap 583 | værktøjslinje 584 | værktøjstip 585 | træ 586 | trætabel 587 | ukendt 588 | visningsområde 589 | vindue 590 | sidehoved 591 | sidefod 592 | afsnit 593 | program 594 | autofuldførelse 595 | redigér linje 596 | indlejret komponent 597 | Tilgængelighedsnavn 598 | Objektinstansens navn formateret til assisterende teknologier 599 | Tilgængelighedsbeskrivelse 600 | Beskrivelse af eet objekt, formateret til assisterende teknologier 601 | Tilgængelighedsophav 602 | Bruges til at bekendtgøre at ophavet er ændret 603 | Tilgængelighedsværdi 604 | Bruges til at bekendtgøre at værdien er ændret 605 | Tilgængelighedsrolle 606 | Tilgængelighedsrolle for dette objekt 607 | Tilgængelighedslag 608 | Tilgængelighedslaget for dette objekt 609 | Tilgængeligheds-MDI-værdi 610 | Tilgængeligheds-MDI-værdien for dette objekt 611 | Tilgængelighedstabeltitel 612 | Bruges til at bekendtgøre at tabeltitlen er ændret; denne egenskab bør ikke benyttes. accessible-table-caption-object bør bruges i 613 | Ausgewählter Link 614 | Gibt an, ob das AtkHyperlink-Objekt ausgewählt ist 615 | Ankeranzahl 616 | Die Anzahl der mit dem AtkHyperlink-Objekt assoziierten Anker 617 | Endindex 618 | Der Endindex des AtkHyperlink-Objekts 619 | Anfangsindex 620 | Der Anfangsindex des AtkHyperlink-Objekts 621 | ungültig 622 | Kürzelbeschriftung 623 | Alarm 624 | Animation 625 | Pfeil 626 | Kalender 627 | Leinwand 628 | Kontrollkästchen 629 | Kontrollmenüobjekt 630 | Farbwähler 631 | Spaltenkopf 632 | Kombinationsfeld 633 | Datumseditor 634 | Desktop-Symbol 635 | Desktop-Rahmen 636 | wählen 637 | Dialog 638 | Verzeichnisleiste 639 | Zeichenfeld 640 | Dateiwähler 641 | Füller 642 | Schriftwähler 643 | Rahmen 644 | Glasleiste 645 | HTML-Container 646 | Symbol 647 | Bild 648 | interner Rahmen 649 | Beschriftung 650 | Schichtleiste 651 | Liste 652 | Listenobjekt 653 | Menü 654 | Menüleiste 655 | Menüobjekt 656 | Optionsleiste 657 | Seitenreiter 658 | Seitenreiter-Liste 659 | Panel 660 | Passworttext 661 | Popup-Menü 662 | Fortschrittsleiste 663 | Druckknopf 664 | Radioknopf 665 | Radiomenüobjekt 666 | Wurzelleiste 667 | Zeilenkopf 668 | Rollbalken 669 | Rollleiste 670 | Trennlinie 671 | Schieber 672 | geteilte Leiste 673 | Spin-Knopf 674 | Statusleiste 675 | Tabelle 676 | Tabellenzelle 677 | Spaltenkopf einer Tabelle 678 | Zeilenkopf einer Tabelle 679 | Objekt in Abrissmenü 680 | Terminal 681 | Text 682 | Auslöseknopf 683 | Werkzeugleiste 684 | Minihilfe 685 | Baum 686 | Baumtabelle 687 | unbekannt 688 | Sichtfeld 689 | Fenster 690 | Kopfzeilen 691 | Fußzeilen 692 | Absatz 693 | Anwendung 694 | Auto-Vervollständigung 695 | Bearbeitungsleiste 696 | eingebettete Komponente 697 | Barrierefreier Name 698 | Name der Objektinstanz, formatiert für den Zugriff durch Hilfstechnologien 699 | Barrierefreie Beschreibung 700 | Beschreibung eines Objekts, formatiert für den Zugriff durch Hilfstechnologien 701 | Barrierefreies Eltern-Element 702 | Wird zur Benachrichtigung bei Änderungen am Eltern-Element verwendet 703 | Barrierefreier Wert 704 | Wird zur Benachrichtigung bei Wertänderungen verwendet 705 | Barrierefreie Rolle 706 | Die barrierefreie Rolle dieses Objekts 707 | Barrierefreie Ebene 708 | Die barrierefreie Ebene dieses Objekts 709 | Barrierefreier MDI-Wert 710 | Der barrierefreie MDI-Wert dieses Objekts 711 | Barr 712 | Επιλεγμένος Σύνδεσμος 713 | Καθορίζει αν το αντικείμενο AtkHyperlink είναι επιλεγμένο 714 | Αριθμός Αγκύρων 715 | Ο αριθμός από άγκυρες που σχετίζονται με το αντικείμενο AtkHyperlink 716 | End index 717 | Το end index του αντικειμένου AtkHyperlink 718 | Start index 719 | Το start index του αντικειμένου AtkHyperlink 720 | μη έγκυρο 721 | ετικέτα συντόμ 722 | ειδοποίηση 723 | κινούμενο σχέδιο 724 | βέλος 725 | ημερολόγιο 726 | canvas 727 | κουτί επιλογής 728 | αντικείμενο μενού επιλογής 729 | επιλογέας χρώματος 730 | κεφαλίδα στήλης 731 | κουτί πολλαπλών 732 | επεξεργαστής-ημερομηνίας 733 | εικονίδιο επιφάνειας 734 | πλαίσιο επιφάνειας εργασίας 735 | dial 736 | διάλογος 737 | ταμπλώ καταλόγου 738 | περιοχή σχεδίασης 739 | επιλογέας αρχείου 740 | filler 741 | επιλογέας γραμματοσειράς 742 | πλαίσιο 743 | glass pane 744 | html container 745 | εικονίδιο 746 | εικόνα 747 | εσωτερικό πλαίσιο 748 | ετικέτα 749 | layered pane 750 | λίστα 751 | αντικείμενο λίστας 752 | μενού 753 | εργαλειοθήκη μενού 754 | αντικείμενο μενού 755 | ταμπλώ επιλογών 756 | στήλη σελίδας 757 | λίστα στήλης σελίδας 758 | ταμπλώ 759 | κείμενο κωδικού 760 | αναδυόμενο μενού 761 | μπάρα προόδου 762 | κουμπί πίεσης 763 | κουμπί radio 764 | αντικείμενο μενού radio 765 | ταμπλώ root 766 | κεφαλίδα γραμμής 767 | γραμμή κύλισης 768 | ταμπλώ κύλισης 769 | διαχωριστικό 770 | μπάρα κύλισης 771 | διαχωρ ταμπλώ 772 | κουμπί στροβιλισμού (spin) 773 | γραμμή κατάστασης 774 | πίνακας 775 | κελί πίνακα 776 | κεφαλίδα στήλης πίνακα 777 | κεφαλίδα γραμμής πίνακα 778 | αντικείμενο αποσπώμενου μενού 779 | τερματικό 780 | κείμενο 781 | κουμπί εναλλαγής 782 | εργαλειοθήκη 783 | συμβουλή εργαλείου 784 | δένδρο 785 | δένδρο πίνακα 786 | άγνωστο 787 | θύρα όψης 788 | παράθυρο 789 | κεφαλίδα 790 | υποσέλιδο 791 | παράγραφος 792 | εφαρμογή 793 | αυτόματη συμπλήρωση 794 | επεξεργασία εργαλειοθήκης 795 | ενσωματομένο συστατικό 796 | Προσβάσιμο Όνομα 797 | Το όνομα της εμφάνισης του αντικειμένου μορφοποιημένο για πρόσβαση από την βοηθητική τεχνολογία 798 | Προσιτή περιγραφή 799 | Περιγραφή του αντικειμένου μορφοποιημένη για πρόσβαση από την βοηθητική τεχνολογία 800 | Προσβάσιμο Γονικό 801 | Χρησιμοποιείται για ειδοποίηση ότι το μητρικό έχει αλλαξει 802 | Προσβάσιμη Τιμή 803 | La información de errores almacenada en su sistema no está actualizada. Elija «Actualizar» para hacerlo. Si elije «No actualizar» forzará a informar el error usando los datos antiguos. 804 | Avanzado 805 | Fenómeno Assbarn 806 | Archivo binario: 807 | Bug Buddy 808 | Bug Buddy puede enviar información de depuración junto a su informe de error. 809 | Las opciones correctas se deben haber seleccionado automáticamente. 810 | Bug Buddy está recogiendo información sobre su cuelgue para enviarla al sistema de seguimiento de errores. Este proceso está automatizado, y tardará unos pocos minutos. Cuando haya terminado, puede pulsar «Mostrar detalles de depuración» para ver la información o pulsar «Continuar» para moverse al siguiente paso en el proceso. 811 | Bug Buddy usa el correo electrónico para enviar un informe de errores. 812 | Elija cómo le gustaría que Bug Buddy envíe el correo-e. 813 | Cc: 814 | Archivo core 815 | D_epurar una aplicación colgada o una aplicación en funcionamiento (sólo expertos) 816 | Depuración 817 | Descripción 818 | Descargando archivos 819 | Correo-e: 820 | Incluir un archivo de texto 821 | Guard_arlo en un archivo para que pueda enviar el informe manualmente 822 | Nombre: 823 | Ruta de sendmail: 824 | Elija un componente, versión y nivel de severidad. 825 | Haga cualquier corrección final al informe de errores. Dese cuenta de que será mostrado en http://bugzilla.gnome.org Incluirá su nombre, dirección de correo-e, y quizá alguna información acerca de cómo falló la aplicación. Si el documento en el que estaba trabajando contenía información sensible, quizá no quiera enviar este informe 826 | Ühtegi rakendust "%s"-i avamiseks ei ole. Sa saad selle asemel selle alla laadida. 827 | Salvesta _kui... 828 | "%s" protokoll ei ole toetatud. 829 | Toetatud protokollid on "http", "https", "ftp", "file", "smb" ja "sftp". 830 | Faili “%s” ei leitud. 831 | Kontrolli faili asukohta ja proovi uuesti. 832 | “%s” pole võimalik leida. 833 | Kontrolli kas oled ühendatud internetti ja kas aadress on korrektne. 834 | Juhul kui see leht oli varem olemas, siis arhiveeritud versiooni võid leida: 835 | "%s" keeldus ühendusest. 836 | “%s” katkestas ühenduse. 837 | “%s” ei vasta. 838 | Vigane aadress 839 | Sinu sisestatud aadress on vigane. 840 | “%s” suunati ümber liiga palju kordi. 841 | Turvakaalutlustel ümbersuunamine lõpetati. 842 | “%s” nõuab krüptitud ühendust. 843 | “%s” loobus ühendusest. 844 | Ühendus serveriga katkes enne kui andmeid lugeda jõuti. 845 | Autonoomses režiimis pole võimalik dokumenti laadida. 846 | “%s” keelab ligipääsu pordile “%d”. 847 | Proksiserveriga pole võimalik ühenduda. 848 | Google'i vahemälust 849 | Internetiarhiivist 850 | Nimetu 851 | Kõik failid 852 | Veebilehed 853 | Tekstifailid 854 | Pildid 855 | XML failid 856 | XUL failid 857 | _Vali sertifikaat 858 | Enda tõendamiseks kasutatava sertifikaadi valimine. 859 | Sertifikaadi ü_ksikasjad 860 | _Ava sertifikaat 861 | _Nõustu 862 | Kas usaldad ebakorrektset turvainfot? 863 | Kas ühenduda ebausaldusväärsesse saiti? 864 | _Usalda seda turvainfot edaspidigi 865 | Üh_endu 866 | Kas võtad vastu kehtivuse kaotanud turvainfo? 867 | "%s" turvaandmed aegusid %s. 868 | Kas võtad vastu veel mittekehtiva turvainfo? 869 | %a, %d, %b %Y 870 | Sa peaks veenduma, et su arvuti kell on õige. 871 | Ühendust "%s"-ga pole võimalik luua. 872 | "%s" sertifikaatide tühistusnimekiri (CRL) vajab uuendamist. 873 | Palun pöördu nõuannete saamiseks oma süsteemihalduri poole. 874 | Kas usaldada sertifitseerimiskeskust? 875 | _Usalda sertifitseerimiskeskust 876 | Kas usaldada uut sertifitseerimiskeskust "%s" veebisaitide tuvastamiseks? 877 | Lien sélectionné 878 | Spécifie si l'objet AtkHyperlink est sélectionné 879 | Nombre d'ancres 880 | Le nombre d'ancres associés avec l'objet AtkHyperlink 881 | Fin d'index 882 | La fin de l'index de l'objet AtkHyperlink 883 | Début d'index 884 | Le début de l'index de l'objet AtkHyperlink 885 | non valide 886 | étiquette du raccourci 887 | alerte 888 | animation 889 | curseur 890 | calendrier 891 | canevas 892 | case à cocher 893 | élément de menu avec case à cocher 894 | sélecteur de couleurs 895 | en-tête de colonne 896 | liste combinée 897 | éditeur de dates 898 | icône du bureau 899 | cadre du bureau 900 | bouton de réglage 901 | boîte de dialogue 902 | panneau des répertoires 903 | zone de dessin 904 | sélecteur de fichiers 905 | caractère de remplissage 906 | sélecteur de polices 907 | cadre 908 | panneau de verre 909 | conteneur html 910 | icône 911 | image 912 | cadre interne 913 | étiquette 914 | panneau superposé 915 | liste 916 | élément de liste 917 | menu 918 | barre de menus 919 | élément de menu 920 | panneau d'options 921 | onglet de page 922 | liste d'onglets de page 923 | tableau de bord 924 | champ de mot de passe 925 | menu contextuel 926 | barre de progression 927 | bouton poussoir 928 | bouton radio 929 | élément de menu avec bouton radio 930 | panneau racine 931 | en-tête de ligne 932 | barre de défilement 933 | panneau de défilement 934 | séparateur 935 | case de défilement 936 | panneau divisible 937 | bouton de réglages 938 | barre d'état 939 | tableau 940 | cellule de tableau 941 | en-tête de colonne de tableau 942 | en-tête de ligne de tableau 943 | élément de menu détachable 944 | console 945 | texte 946 | bouton à état 947 | barre d'outils 948 | bulle d'aide 949 | arbre 950 | Tableau arborescent 951 | inconnu 952 | fenêtre de travail 953 | fenêtre 954 | en-tête de page 955 | bas de page 956 | paragraphe 957 | application 958 | Autocomplétion 959 | barre d'édition 960 | composant incorporé 961 | Nom accessible 962 | Nom d'une instance d'objet formaté pour être accessible par les aides techniques 963 | Description accessible 964 | Description d'un objet, formaté pour être accessible par les aides techniques 965 | Parent accessible 966 | Est utilisé pour notifier que le parent a changé 967 | Valeur accessible 968 | ሬዲዮ-ቁልፍ 969 | ዶሴ `%s'ን ማስፈጠር አልተቻለም፦ 970 | አዲስ ዶሴ ፍጠር 971 | በመጫን ላይ... 972 | Ne cúðe findan þone pæþ 973 | Onlícnesgesceap ungecnáwen 974 | لتنقيح أيّة عمليّة يطلب اسم التّطبيق أيضاً.رجاءً زوّد أيضاً بمعامل سطر أوامر --appname. 975 | الملف الذي فيه سيحفظ تقرير الخلال 976 | تعذّر تحديد نسق الملف %s 977 | ^إرسال تقرير خلل 978 | ارسال تقريرا لك فقط 979 | حفظ التقرير في ملف 980 | التطبيق المنهار 981 | الملف النواة 982 | ﻻ شيء 983 | اسم الموصول 984 | اﻻسم 985 | عنوان البريد الالكتروني للموصول 986 | البريد اﻻلكتروني 987 | الرزمة المحتوية على البرنامج 988 | الرزمة 989 | اصدارة الرزمة 990 | اﻻصدارة 991 | اسم ملف البرنامج المنهار 992 | الملف 993 | PID البرنامج المنهار 994 | PID 995 | الملف النواة من البرنامج 996 | ملف النص الذي سيُضمن في التقرير 997 | لم يمكن العثور على قطعة باسم %s عند %s 998 | لم ينته gdb من تلقي معلومات التنقيح. 999 | ا اقتل عملية gdb (ستكون مصفوفة تتبع السير منقوصة)؟ 1000 | لقد خرج gdb مسبقا 1001 | حفظ تتبع السير 1002 | الرجاء الانتظار حالما يحفظ باك بدي مصفوفة تتيع السير... 1003 | لم تحفظ مصفوفة تتبع السير في %s: 1004 | সংলাপ পৰিচয় প্রমাণ 1005 | সংলাপ সংক্রান্ত তথ্য 1006 | সংলাপ সংক্রান্ত সতর্কবাণী 1007 | সংলাপ সংকপ্রশ্ন 1008 | টনা আৰু এৰি দিয়া 1009 | বহুবাৰ টনা আৰু এৰি দিয়া 1010 | যোগ 1011 | কার্যকৰ 1012 | ডাঠ 1013 | বাতিল 1014 | সিডৰূপান্তৰ কৰা 1015 | কপি 1016 | কটা 1017 | মোছা 1018 | চলোৱা 1019 | বিচৰা 1020 | বিচৰা আৰু পৰিবৰতন কৰা 1021 | ফ্লপি 1022 | তলিলৈ @মূধচলৈ যোৱা 1023 | পিছলৈ যোৱা 1024 | তললৈ যোৱা 1025 | আগলৈ যোৱা 1026 | উপৰলৈ যোৱা 1027 | সহায় 1028 | ঘৰ 1029 | সূচিপত্র 1030 | টিফাই কৰা 1031 | সুষমভাবে জাস্টিফাই কৰা 1032 | বাঁও পিনৰ পৰা জাস্টিফাই কৰা 1033 | সোঁ পিনৰ পৰা জাসয় 1034 | ঠিক আছে 1035 | খোলা 1036 | আঠা দিয়া 1037 | পছন্দ 1038 | ছপা কৰা 1039 | ছপাৰ আগতে ছোৱা 1040 | বৈশিষ্ট 1041 | প্রস্থান 1042 | আ 1043 | সংৰক্ষিত কপি ব্যবহাৰ কৰা 1044 | সংৰক্ষণ 1045 | নতুন নামেৰে সংৰক্ষণ 1046 | ৰং বাছা 1047 | ফন্ট বাছা 1048 | উর 1049 | বানান-পৰীক্ষণ 1050 | ৰখা 1051 | মাজেৰে ৰেখা অকাঁ 1052 | মোছা ৰদ্দ কৰা 1053 | তলেৰে ৰেখা অকাঁ 1054 | হয় 1055 | ১০০ ডাঙৰ কৰা 1056 | সৰু কৰা 1057 | সময়ৰক্ষক 1058 | সময়ৰক্ষক স্থগিত কৰা 1059 | আবর্জনা 1060 | আবর্জনা পূর্ণ 1061 | নম্বৰ^মিডি 1062 | মাইক্রোফোন 1063 | লাইন ইন 1064 | মেইল 1065 | মেইল গ্রহণ 1066 | মেইল প্রেৰণ 1067 | মেইলৰ উত্তৰ 1068 | মেইল আগলৈক্ত কৰা 1069 | কিতাপ ৰঙা 1070 | কিতাপ সেউজীয়া 1071 | কিতাপ নীলা 1072 | কিতাপ হালধীয়া 1073 | কিতাপ খোলা 1074 | একাধিক পূর্ণ কৰা 1075 | টেক্সট অবচ্ছেদ(Indent) 1076 | টেক্সট অবচ্ছেদ(Indent) ৰদ্দ কৰা 1077 | টেক্সট বুলেৰযুক্ত তালিকা 1078 | পৰিচয় প্রমাণ প্রক্রিয়া 1079 | (অঙ্কুর বাংলা প্রকল্পের তরফ থেকে) 1080 | ড্যাশার 1081 | ড্যাশার একটি প্রেডিকটিভ টেক্সট এন্ট %ld সেকেন্ডেেশন 1082 | %d অক্ষর আউটপুট 1083 | ৫: 1084 | ৬: 1085 | ৭: 1086 | ৮: 1087 | ৯: 1088 | বর্ণ নির্বাচন: 1089 | বাটন নিয়ন্ত্রণ সেটাপ: 1090 | রং 1091 | নিয়ন্ত্রণের ধরণ: 1092 | অন্যান্য পছন্দসমূহ: 1093 | পারিপার্শ্বিক অবস্থান: 1094 | চালু করা হচ্ছে ও বন্ধ করা হচ্ছে: 1095 | টগল বাটন মোড: 1096 | প্রদর্শন সম্/b> 1097 | X/Y অক্ষ: 1098 | Y অক্ষ সম্বন্ধীয় পছন্দসমূহ: 1099 | অগ্রসর 1100 | বর্ণ 1101 | বর্ণ ডিউপর 1102 | বাটন নিয়ন্ত্রণ সেটাপ 1103 | বাটন মোড 1104 | বাটন: 1105 | স্বয়ংক্রীয়ভাবে রঙের স্কীম বদলাও 1106 | রং^ কিছু কপি কর (_স) 1107 | থামার পরে সমস্ত কিছু কপি কর 1108 | কাটো 1109 | আবর্তমান বাটন মোড 1110 | ড্যাশারসের অবস্থানে শুরুর জন্যে মধ্যম রেখার থেকে দুরত্ব: 1111 | নীচে/৩: 1112 | বাক্সের সীমা আঁকো 1113 | কবাটন নিয়ন্ত্রণ সম্বন্ধীয় পছন্দ সম্পাদন করুন 1114 | অন্য উইন্ডো-তে লেখো 1115 | আইট্র্যাকার মোপর এবং নিচ ব্যবহারেিত থাকলে, উ 1116 | কোঅর্ডিনেট সামনের বা পেছনের দিকে আবর্ত হবে। আর ডান এ নির্বাচিত মানটি নিশ্চিত করব 1117 | নতুন ফাইল 1118 | সাধারণ 1119 | y অংশটিকে যতগুলি পিক্সেল দিয়ে ঢাকা হবে 1120 | এক মাত্রিক মোড 1121 | ফাইয়িক বিরতি 1122 | ডান থেকে বামদিকে 1123 | ডান/৪ 1124 | ফাইল সংরক্ষণ করো 1125 | নতুন নামে ফাইল সংরক্ষণ 1126 | ফনস্থান দেখাও 1127 | গতি নির্দেশক স্লাইডার দেখাও 1128 | টুলবার দেখাও 1129 | থামলে কথা বোলো 1130 | গতি 1131 | বামরা হলে শুরু কোরো 1132 | স্পেস বার ব্যবহার করা হলে শুরু কোরো 1133 | মাউসের অবস্থান বদল করা হলম্প কোরো 1134 | উপর থেকে নীচে 1135 | প্রশিক্ষণ চলছে 1136 | ড্যাশারকে প্রশিক্ষণ দেওয়া হচ্ছে - অনুগ্এই কন্ট্রোলটি ব্যবহার করুন যদি আপনি আপনার লেটার বক্সের 1137 | আকার সমন্বয় করতে চান। মনে রাখবেন উচ্চ মান নির্বাচন 1138 | আপনার লেখার গতিকে কমিয়ে দিবে 1139 | খুব বড় 1140 | দর্শন 1141 | পরিচিতি (_প) 1142 | ফাইলের শেষে যট (_ড) 1143 | ড্যাশার ফন্টের সাইজ (_ড) 1144 | সম্পাদন (_ম) 1145 | ফন্ট সম্পাদন (_ট) 1146 | ফাইল (_ফ) 1147 | সহক্ষণ টেক্সট ইমপোর্ট করো (_ই) 1148 | পছন্দসমূহ (_প) 1149 | পুরোনো ফন্টে ফেরত যাও (_ফ) 1150 | অআইঈউঊ 1151 | এই মোডটি নির্বাচিত থাকলে, উপর এবং নিচ ব্যবহারে 1152 | ির্বাচন সীমা 1153 | কার্সার থেকে নির্বাচি 1154 | 諾してみますか? 1155 | かしな認証ドメイン: %s 1156 | 発行者: %s 1157 | IMAP サーバから予期しない応答がありました: %s 1158 | %s (ポート %s) へ接続できませんでした: %s 1159 | ニュース・ストアにフォルダを生成できません: 代わりに購読を申請して下さい。 1160 | 指定されたフォルダ名は不適切です: %s 1161 | 작업중인 문서 내에 공개하기 민감한 정보가 들어 있다면, 1162 | 이 버그 보고서를 보내지 않는 편이 좋을 것입니다. 1163 | 꼭 영어로 보고서를 작성하십시>오. 1164 | 버그를 알릴 제품이름이나 프로그램을 선택하십시오. 1165 | 보고하려는 버그가 가장 >자주 보고되는 버그 중에 들어 있다면 잠시 기다려 주십시오. 1166 | 버그가 이미 보고되어 있다면, 또 보고하지는 말아 주십시오. 1167 | 버그버디가 제품 목록>을 갱신하는 동안 1168 | 기다려 주십시오. 1169 | 프로세스 ID: 1170 | 저장할 파일: 1171 | 보고를 새 이름으로 저장하기... 1172 | 저 1173 | 장: 1174 | sendmail 설정 1175 | 심각성: 1176 | 프로그램 보기(_A) 1177 | 디버깅 정보 보여주기(_D) 1178 | 제품 보기(_P) 1179 | 다음의 가장 많이 보고되는 버그 보여주기: 1180 | 간단히 1181 | 시작 1182 | 중지 1183 | 또다른 >버그를 보내기 1184 | 요약 1185 | 프로그램이 올바르게 동작하지 않습니다(_A) 1186 | 문서가 틀렸습니>다(_D) 1187 | 번역이 틀렸습니다(_T) 1188 | 받는 사람: 1189 | sendmail 직접 사용(_S) 1190 | 버전: 1191 | 업데이 1192 | 트 하지 않음(_D) 1193 | 빠진 기능을 요청하기(_R) 1194 | 업데이트(_U) 1195 | 컴포넌트 1196 | 설명 1197 | 전자메 1198 | 일 정보 1199 | 완료됨 1200 | gdb 1201 | 소개 1202 | 메일 설정 1203 | 가장 잦은 1204 | 제품 1205 | %2$d개중 %1$d개 ID 1206 | 제>품명 1207 | 컴포넌트 1208 | 버그버디에서 '%s'을(를) 열 수 없습니다. 1209 | 버그버디가 제대로 설치되었는지 확인하십시오. 1210 | 버그버디는 지금 종료합니다. 1211 | 버그버디에서 버그를 어디에 제출할 지에 관한 정보를 읽지 못했습니다. 1212 | 버그버디가 제대로 설치되었는 지 확인하십시오. 1213 | @圖像/標籤框 1214 | 在警告對話視窗中,包圍標籤及圖像框線的闊度 1215 | 警告類型 1216 | 警告的類型 1217 | 警告按鈕 1218 | 出現在警告對話視窗中的按鈕 1219 | 顯示更多訊息(_D) 1220 | 文字 1221 | 標籤中的文>字。 1222 | 對齊方式 1223 | 文字在標籤中排列時的對齊方式。它不會影響標籤元件本身在空位內排列 1224 | 的位置。該方面的資料請參考 GtkMisc::xalign。 1225 | 換行 1226 | 如選用本選項,當字句太長時會 1227 | 自動換行。 1228 | 游標位置 1229 | 游標目前的位置,以字元表示。 1230 | 選擇範圍 1231 | 從游標位置至選擇區 1232 | 域末端之間的字元數目。 1233 | 全部選取 1234 | 輸入法 1235 | GConf 錯誤: 1236 | GConf 錯誤: %s 1237 | 所有進一步的錯誤訊息只會在終端機中顯示。 1238 | GConf 錯誤 1239 | 01/01/00, 01:00 上午 1240 | 1/1/00, 1:00 上午 1241 | 1/ 1/00, 1:00 上午 1242 | 沒有選取任何圖像。 1243 | 請按下圖像來選取它。 1244 | 沒有選取任何東西 1245 | 預設 1246 | 圖示 1247 | 名稱 1248 | 沒有選取任何程式 1249 | %s 文件 1250 | 不明 1251 | 選取一程式來開啟 %s 及類型為“%s”的檔案 1252 | 無法執行程式 1253 | >無法找到‘%s’ 1254 | 無法找到程式 1255 | 無法加入程式 1256 | 無法將程式加入程式資料庫中 1257 | 選取一個程 1258 | 式 1259 | 以其它應用程式開啟 1260 | 選取一程式來檢視它的描述。 1261 | 使用自訂的指令(_C) 1262 | 瀏覽(_B)... 1263 | 開啟(_O) 1264 | 以其它程式開啟 %s及類型為“%s”的檔案: 1265 | 加入(_A) 1266 | 加入程式 1267 | 您可以按下取消來停止這次操作。 1268 | 資訊 1269 | 警告 1270 | 錯誤 1271 | 問題 1272 | (無效的統一碼) 1273 | 覆寫檔案 %s? 1274 | 檔案已經存在。您確定要覆蓋它? 1275 | 略過 1276 | 覆寫 1277 | 儲存 %s 時發生錯>誤。 1278 | 重試 1279 | 無法決定目的地 uri。 1280 | 無法決定 %s 的檔案格式 1281 | 請使用一個合適的檔案名 1282 | 稱後置字,或選擇一個檔案格式。 1283 | 儲存圖片時發生錯誤。 1284 | 列印 1285 | 預覽列印 1286 | 您確定要將 1287 | %i 個檔案丟進回收筒? 1288 | 無法存取回收筒。 1289 | 當刪除圖片 %s 時發生錯誤 1290 | %i x %i 像素 1291 | %s %i%% 1292 | 原因:%s 1293 | 載入 %s 的圖片失敗 1294 | 檔案(_F) 1295 | 編輯(_E) 1296 | 顯示(_V) 1297 | 圖片(_I) 1298 | 求助(_H) 1299 | 新增視窗(_N) 1300 | 開啟新視窗 1301 | 開啟(_O)... 1302 | 開啟檔案 1303 | 開啟資料夾(_F)... 1304 | 開啟資料夾 1305 | 關閉(_C) 1306 | 關閉視窗 1307 | 偏好設定(_N) 1308 | Eye of GNOME 偏好設定 1309 | 內容(_C) 1310 | 本應用程式的說明文件 1311 | 關於(_A) 1312 | 關於本程式 1313 | 工具列(_T) 1314 | 在目前的視窗中切換是否>顯示工具列 1315 | 狀態列(_S) 1316 | 在目前的視窗中切換是否顯示狀態列 1317 | 儲存(_S) 1318 | 另存新檔(_A) 1319 | 復原(_U) 1320 | 左右相反(_H) 1321 | 上下顛倒(_V) 1322 | 順時針方向旋轉(_R) 1323 | 逆時針方向旋轉(_L) 1324 | 180 度旋轉(_E) 1325 | 刪除 1326 | 全螢幕(_F) 1327 | 投影片(_S) 1328 | 拉近(_Z) 1329 | 拉遠(_O) 1330 | 原來大小(_N) 1331 | 最適大小(_F) 1332 | 圖片資訊(_I) 1333 | 在目前的視窗中切換是否顯示資訊窗格 1334 | 新增 1335 | 開啟 1336 | 關閉 1337 | 儲存 1338 | 復原 1339 | 右 1340 | 左 1341 | 拉近 1342 | 拉遠 1343 | 原來大小 1344 | 符合 1345 | 找不到使用者介面的描述。 1346 | 無法 1347 | 建立 Eye of GNOME 使用者介面 1348 | 是否同時開啟多個的個別視窗? 1349 | 這樣將會同時開啟 %i 個視窗。您是否想以圖片集的方式開啟? 1350 | 單一視窗 1351 | 圖片集 1352 | 找不到檔案 1353 | 無法開啟‘%s’ 1354 | حاشیهی تصویر/برچسب 1355 | عرض حاشیهی دور برچسب و تصویر در محاورهی آژیر 1356 | نوع آژیر 1357 | نوع آژیر 1358 | دکمههای آژیر 1359 | دکمههای نشان داده شده در محاورهی آژیر 1360 | نشان دادن _جزئیات بیشتر 1361 | متن 1362 | متن برچسب 1363 | تراز کردن 1364 | پیچش سطرها 1365 | اگر یک شود، اگر سطرها خیلی عریض شوند میپیچند. 1366 | موقعیت مکاننما 1367 | موقعیت فعلی مکاننمای درج در نویسهها. 1368 | موقعیت طرف دیگر انتخاب نسبت به مکاننما به نویسه. 1369 | انتخاب همه 1370 | روشهای ورودی 1371 | خطای GConf: 1372 | %s 1373 | خطای GConf: %s 1374 | همهی خطاهای بعدی فقط روی پایانه نمایش مییابند. 1375 | خطای GConf 1376 | تصویری انتخاب نشد. 1377 | برای انتخاب یک تصویر باید رویش کلیک کنید. 1378 | انتخابی انجام نشد 1379 | پیشفرضنام 1380 | برنامهای انتخاب نشد 1381 | %s نوشتار 1382 | نامعلوم 1383 | برنامهای برای باز کردن %s و دیگر پروندههای از نوع "%s" انتخاب کنید 1384 | برنامه اجرا نشد 1385 | '%s' پیدا نشد 1386 | برنامه پیدا نشد 1387 | افزودن برنامه ممکن نیست 1388 | افزودن برنامه به پایگاه دادهی برنامه ممکن نیست 1389 | یک برنامه انتخاب کنید 1390 | باز کردن با 1391 | برنامهای برای باز کردن %s و دیگر پروندههای از نوع "%s" انتخاب کنید _مرور... باز کردن %s و دیگر پروندههای نوع "%s" با: 1392 | _افزودن 1393 | افزودن برنامه 1394 | میتوانید با کلیک کردن روی انصراف، این عملیات را متوقف کنید. 1395 | اطلاعات 1396 | هشدار 1397 | خطا 1398 | سؤال 1399 | (یونیکد نامعتبر) 1400 | --------------------------------------------------------------------------------