久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Java計時器StopWatch實現方法代碼實例

瀏覽:2日期:2022-08-29 16:07:48

下面提供三種計時器的寫法供大家參考,大家可以自行選擇自己鐘愛的使用。

寫法一(Spring 包提供的計時器):

import java.text.NumberFormat;import java.util.LinkedList;import java.util.List;/** * Simple stop watch, allowing for timing of a number of tasks, * exposing total running time and running time for each named task. * * <p>Conceals use of {@code System.currentTimeMillis()}, improving the * readability of application code and reducing the likelihood of calculation errors. * * <p>Note that this object is not designed to be thread-safe and does not * use synchronization. * * <p>This class is normally used to verify performance during proof-of-concepts * and in development, rather than as part of production applications. * * @author Rod Johnson * @author Juergen Hoeller * @author Sam Brannen * @since May 2, 2001 */public class StopWatch { /** * Identifier of this stop watch. * Handy when we have output from multiple stop watches * and need to distinguish between them in log or console output. */ private final String id; private boolean keepTaskList = true; private final List<TaskInfo> taskList = new LinkedList<TaskInfo>(); /** Start time of the current task */ private long startTimeMillis; /** Is the stop watch currently running? */ private boolean running; /** Name of the current task */ private String currentTaskName; private TaskInfo lastTaskInfo; private int taskCount; /** Total running time */ private long totalTimeMillis; /** * Construct a new stop watch. Does not start any task. */ public StopWatch() { this(''); } /** * Construct a new stop watch with the given id. * Does not start any task. * @param id identifier for this stop watch. * Handy when we have output from multiple stop watches * and need to distinguish between them. */ public StopWatch(String id) { this.id = id; } /** * Return the id of this stop watch, as specified on construction. * @return the id (empty String by default) * @since 4.2.2 * @see #StopWatch(String) */ public String getId() { return this.id; } /** * Determine whether the TaskInfo array is built over time. Set this to * 'false' when using a StopWatch for millions of intervals, or the task * info structure will consume excessive memory. Default is 'true'. */ public void setKeepTaskList(boolean keepTaskList) { this.keepTaskList = keepTaskList; } /** * Start an unnamed task. The results are undefined if {@link #stop()} * or timing methods are called without invoking this method. * @see #stop() */ public void start() throws IllegalStateException { start(''); } /** * Start a named task. The results are undefined if {@link #stop()} * or timing methods are called without invoking this method. * @param taskName the name of the task to start * @see #stop() */ public void start(String taskName) throws IllegalStateException { if (this.running) { throw new IllegalStateException('Can’t start StopWatch: it’s already running'); } this.running = true; this.currentTaskName = taskName; this.startTimeMillis = System.currentTimeMillis(); } /** * Stop the current task. The results are undefined if timing * methods are called without invoking at least one pair * {@code start()} / {@code stop()} methods. * @see #start() */ public void stop() throws IllegalStateException { if (!this.running) { throw new IllegalStateException('Can’t stop StopWatch: it’s not running'); } long lastTime = System.currentTimeMillis() - this.startTimeMillis; this.totalTimeMillis += lastTime; this.lastTaskInfo = new TaskInfo(this.currentTaskName, lastTime); if (this.keepTaskList) { this.taskList.add(lastTaskInfo); } ++this.taskCount; this.running = false; this.currentTaskName = null; } /** * Return whether the stop watch is currently running. * @see #currentTaskName() */ public boolean isRunning() { return this.running; } /** * Return the name of the currently running task, if any. * @since 4.2.2 * @see #isRunning() */ public String currentTaskName() { return this.currentTaskName; } /** * Return the time taken by the last task. */ public long getLastTaskTimeMillis() throws IllegalStateException { if (this.lastTaskInfo == null) { throw new IllegalStateException('No tasks run: can’t get last task interval'); } return this.lastTaskInfo.getTimeMillis(); } /** * Return the name of the last task. */ public String getLastTaskName() throws IllegalStateException { if (this.lastTaskInfo == null) { throw new IllegalStateException('No tasks run: can’t get last task name'); } return this.lastTaskInfo.getTaskName(); } /** * Return the last task as a TaskInfo object. */ public TaskInfo getLastTaskInfo() throws IllegalStateException { if (this.lastTaskInfo == null) { throw new IllegalStateException('No tasks run: can’t get last task info'); } return this.lastTaskInfo; } /** * Return the total time in milliseconds for all tasks. */ public long getTotalTimeMillis() { return this.totalTimeMillis; } /** * Return the total time in seconds for all tasks. */ public double getTotalTimeSeconds() { return this.totalTimeMillis / 1000.0; } /** * Return the number of tasks timed. */ public int getTaskCount() { return this.taskCount; } /** * Return an array of the data for tasks performed. */ public TaskInfo[] getTaskInfo() { if (!this.keepTaskList) { throw new UnsupportedOperationException('Task info is not being kept!'); } return this.taskList.toArray(new TaskInfo[this.taskList.size()]); } /** * Return a short description of the total running time. */ public String shortSummary() { return 'StopWatch ’' + getId() + '’: running time (millis) = ' + getTotalTimeMillis(); } /** * Return a string with a table describing all tasks performed. * For custom reporting, call getTaskInfo() and use the task info directly. */ public String prettyPrint() { StringBuilder sb = new StringBuilder(shortSummary()); sb.append(’n’); if (!this.keepTaskList) { sb.append('No task info kept'); } else { sb.append('-----------------------------------------n'); sb.append('ms % Task namen'); sb.append('-----------------------------------------n'); NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMinimumIntegerDigits(5); nf.setGroupingUsed(false); NumberFormat pf = NumberFormat.getPercentInstance(); pf.setMinimumIntegerDigits(3); pf.setGroupingUsed(false); for (TaskInfo task : getTaskInfo()) {sb.append(nf.format(task.getTimeMillis())).append(' ');sb.append(pf.format(task.getTimeSeconds() / getTotalTimeSeconds())).append(' ');sb.append(task.getTaskName()).append('n'); } } return sb.toString(); } /** * Return an informative string describing all tasks performed * For custom reporting, call {@code getTaskInfo()} and use the task info directly. */ @Override public String toString() { StringBuilder sb = new StringBuilder(shortSummary()); if (this.keepTaskList) { for (TaskInfo task : getTaskInfo()) {sb.append('; [').append(task.getTaskName()).append('] took ').append(task.getTimeMillis());long percent = Math.round((100.0 * task.getTimeSeconds()) / getTotalTimeSeconds());sb.append(' = ').append(percent).append('%'); } } else { sb.append('; no task info kept'); } return sb.toString(); } /** * Inner class to hold data about one task executed within the stop watch. */ public static final class TaskInfo { private final String taskName; private final long timeMillis; TaskInfo(String taskName, long timeMillis) { this.taskName = taskName; this.timeMillis = timeMillis; } /** * Return the name of this task. */ public String getTaskName() { return this.taskName; } /** * Return the time in milliseconds this task took. */ public long getTimeMillis() { return this.timeMillis; } /** * Return the time in seconds this task took. */ public double getTimeSeconds() { return (this.timeMillis / 1000.0); } }}

下面寫一個調用:

public static void main(String[] args) throws InterruptedException {// StopWatchTest.test0(); StopWatchTest.test1();}public static void test1() throws InterruptedException { StopWatch sw = new StopWatch('test'); sw.start('task1'); // do something Thread.sleep(100); sw.stop(); sw.start('task2'); // do something Thread.sleep(200); sw.stop(); System.out.println('sw.prettyPrint()~~~~~~~~~~~~~~~~~'); System.out.println(sw.prettyPrint());}

運行結果:

sw.prettyPrint()~~~~~~~~~~~~~~~~~StopWatch ’test’: running time (millis) = 308-----------------------------------------ms % Task name-----------------------------------------00104 034% task100204 066% task2---------------------

start開始記錄,stop停止記錄,然后通過StopWatch的prettyPrint方法,可直觀的輸出代碼執行耗時,以及執行時間百分比,瞬間感覺比之前的方式高大上了一個檔次。

 除此之外,還有以下兩個方法shortSummary,getTotalTimeMillis,查看程序執行時間。

寫法二(apache.commons實現的計時器):

import java.util.concurrent.TimeUnit;/** * <p> * <code>StopWatch</code> provides a convenient API for timings. * </p> * * <p> * To start the watch, call {@link #start()} or {@link StopWatch#createStarted()}. At this point you can: * </p> * <ul> * <li>{@link #split()} the watch to get the time whilst the watch continues in the background. {@link #unsplit()} will * remove the effect of the split. At this point, these three options are available again.</li> * <li>{@link #suspend()} the watch to pause it. {@link #resume()} allows the watch to continue. Any time between the * suspend and resume will not be counted in the total. At this point, these three options are available again.</li> * <li>{@link #stop()} the watch to complete the timing session.</li> * </ul> * * <p> * It is intended that the output methods {@link #toString()} and {@link #getTime()} should only be called after stop, * split or suspend, however a suitable result will be returned at other points. * </p> * * <p> * NOTE: As from v2.1, the methods protect against inappropriate calls. Thus you cannot now call stop before start, * resume before suspend or unsplit before split. * </p> * * <p> * 1. split(), suspend(), or stop() cannot be invoked twice<br> * 2. unsplit() may only be called if the watch has been split()<br> * 3. resume() may only be called if the watch has been suspend()<br> * 4. start() cannot be called twice without calling reset() * </p> * * <p>This class is not thread-safe</p> * * @since 2.0 */public class StopWatch { private static final long NANO_2_MILLIS = 1000000L; /** * Provides a started stopwatch for convenience. * * @return StopWatch a stopwatch that’s already been started. * * @since 3.5 */ public static StopWatch createStarted() { final StopWatch sw = new StopWatch(); sw.start(); return sw; } /** * Enumeration type which indicates the status of stopwatch. */ private enum State { UNSTARTED { @Override boolean isStarted() {return false; } @Override boolean isStopped() {return true; } @Override boolean isSuspended() {return false; } }, RUNNING { @Override boolean isStarted() {return true; } @Override boolean isStopped() {return false; } @Override boolean isSuspended() {return false; } }, STOPPED { @Override boolean isStarted() {return false; } @Override boolean isStopped() {return true; } @Override boolean isSuspended() {return false; } }, SUSPENDED { @Override boolean isStarted() {return true; } @Override boolean isStopped() {return false; } @Override boolean isSuspended() {return true; } }; /** * <p> * The method is used to find out if the StopWatch is started. A suspended * StopWatch is also started watch. * </p> * @return boolean * If the StopWatch is started. */ abstract boolean isStarted(); /** * <p> * This method is used to find out whether the StopWatch is stopped. The * stopwatch which’s not yet started and explicitly stopped stopwatch is * considered as stopped. * </p> * * @return boolean * If the StopWatch is stopped. */ abstract boolean isStopped(); /** * <p> * This method is used to find out whether the StopWatch is suspended. * </p> * * @return boolean * If the StopWatch is suspended. */ abstract boolean isSuspended(); } /** * Enumeration type which indicates the split status of stopwatch. */ private enum SplitState { SPLIT, UNSPLIT } /** * The current running state of the StopWatch. */ private State runningState = State.UNSTARTED; /** * Whether the stopwatch has a split time recorded. */ private SplitState splitState = SplitState.UNSPLIT; /** * The start time. */ private long startTime; /** * The start time in Millis - nanoTime is only for elapsed time so we * need to also store the currentTimeMillis to maintain the old * getStartTime API. */ private long startTimeMillis; /** * The stop time. */ private long stopTime; /** * <p> * Constructor. * </p> */ public StopWatch() { super(); } /** * <p> * Start the stopwatch. * </p> * * <p> * This method starts a new timing session, clearing any previous values. * </p> * * @throws IllegalStateException * if the StopWatch is already running. */ public void start() { if (this.runningState == State.STOPPED) { throw new IllegalStateException('Stopwatch must be reset before being restarted. '); } if (this.runningState != State.UNSTARTED) { throw new IllegalStateException('Stopwatch already started. '); } this.startTime = System.nanoTime(); this.startTimeMillis = System.currentTimeMillis(); this.runningState = State.RUNNING; } /** * <p> * Stop the stopwatch. * </p> * * <p> * This method ends a new timing session, allowing the time to be retrieved. * </p> * * @throws IllegalStateException * if the StopWatch is not running. */ public void stop() { if (this.runningState != State.RUNNING && this.runningState != State.SUSPENDED) { throw new IllegalStateException('Stopwatch is not running. '); } if (this.runningState == State.RUNNING) { this.stopTime = System.nanoTime(); } this.runningState = State.STOPPED; } /** * <p> * Resets the stopwatch. Stops it if need be. * </p> * * <p> * This method clears the internal values to allow the object to be reused. * </p> */ public void reset() { this.runningState = State.UNSTARTED; this.splitState = SplitState.UNSPLIT; } /** * <p> * Split the time. * </p> * * <p> * This method sets the stop time of the watch to allow a time to be extracted. The start time is unaffected, * enabling {@link #unsplit()} to continue the timing from the original start point. * </p> * * @throws IllegalStateException * if the StopWatch is not running. */ public void split() { if (this.runningState != State.RUNNING) { throw new IllegalStateException('Stopwatch is not running. '); } this.stopTime = System.nanoTime(); this.splitState = SplitState.SPLIT; } /** * <p> * Remove a split. * </p> * * <p> * This method clears the stop time. The start time is unaffected, enabling timing from the original start point to * continue. * </p> * * @throws IllegalStateException * if the StopWatch has not been split. */ public void unsplit() { if (this.splitState != SplitState.SPLIT) { throw new IllegalStateException('Stopwatch has not been split. '); } this.splitState = SplitState.UNSPLIT; } /** * <p> * Suspend the stopwatch for later resumption. * </p> * * <p> * This method suspends the watch until it is resumed. The watch will not include time between the suspend and * resume calls in the total time. * </p> * * @throws IllegalStateException * if the StopWatch is not currently running. */ public void suspend() { if (this.runningState != State.RUNNING) { throw new IllegalStateException('Stopwatch must be running to suspend. '); } this.stopTime = System.nanoTime(); this.runningState = State.SUSPENDED; } /** * <p> * Resume the stopwatch after a suspend. * </p> * * <p> * This method resumes the watch after it was suspended. The watch will not include time between the suspend and * resume calls in the total time. * </p> * * @throws IllegalStateException * if the StopWatch has not been suspended. */ public void resume() { if (this.runningState != State.SUSPENDED) { throw new IllegalStateException('Stopwatch must be suspended to resume. '); } this.startTime += System.nanoTime() - this.stopTime; this.runningState = State.RUNNING; } /** * <p> * Get the time on the stopwatch. * </p> * * <p> * This is either the time between the start and the moment this method is called, or the amount of time between * start and stop. * </p> * * @return the time in milliseconds */ public long getTime() { return getNanoTime() / NANO_2_MILLIS; } /** * <p> * Get the time on the stopwatch in the specified TimeUnit. * </p> * * <p> * This is either the time between the start and the moment this method is called, or the amount of time between * start and stop. The resulting time will be expressed in the desired TimeUnit with any remainder rounded down. * For example, if the specified unit is {@code TimeUnit.HOURS} and the stopwatch time is 59 minutes, then the * result returned will be {@code 0}. * </p> * * @param timeUnit the unit of time, not null * @return the time in the specified TimeUnit, rounded down * @since 3.5 */ public long getTime(final TimeUnit timeUnit) { return timeUnit.convert(getNanoTime(), TimeUnit.NANOSECONDS); } /** * <p> * Get the time on the stopwatch in nanoseconds. * </p> * * <p> * This is either the time between the start and the moment this method is called, or the amount of time between * start and stop. * </p> * * @return the time in nanoseconds * @since 3.0 */ public long getNanoTime() { if (this.runningState == State.STOPPED || this.runningState == State.SUSPENDED) { return this.stopTime - this.startTime; } else if (this.runningState == State.UNSTARTED) { return 0; } else if (this.runningState == State.RUNNING) { return System.nanoTime() - this.startTime; } throw new RuntimeException('Illegal running state has occurred.'); } /** * <p> * Get the split time on the stopwatch. * </p> * * <p> * This is the time between start and latest split. * </p> * * @return the split time in milliseconds * * @throws IllegalStateException * if the StopWatch has not yet been split. * @since 2.1 */ public long getSplitTime() { return getSplitNanoTime() / NANO_2_MILLIS; } /** * <p> * Get the split time on the stopwatch in nanoseconds. * </p> * * <p> * This is the time between start and latest split. * </p> * * @return the split time in nanoseconds * * @throws IllegalStateException * if the StopWatch has not yet been split. * @since 3.0 */ public long getSplitNanoTime() { if (this.splitState != SplitState.SPLIT) { throw new IllegalStateException('Stopwatch must be split to get the split time. '); } return this.stopTime - this.startTime; } /** * Returns the time this stopwatch was started. * * @return the time this stopwatch was started * @throws IllegalStateException * if this StopWatch has not been started * @since 2.4 */ public long getStartTime() { if (this.runningState == State.UNSTARTED) { throw new IllegalStateException('Stopwatch has not been started'); } // System.nanoTime is for elapsed time return this.startTimeMillis; } /** * <p> * Gets a summary of the time that the stopwatch recorded as a string. * </p> * * <p> * The format used is ISO 8601-like, <i>hours</i>:<i>minutes</i>:<i>seconds</i>.<i>milliseconds</i>. * </p> * * @return the time as a String */ @Override public String toString() { return DurationFormatUtils.formatDurationHMS(getTime()); } /** * <p> * Gets a summary of the split time that the stopwatch recorded as a string. * </p> * * <p> * The format used is ISO 8601-like, <i>hours</i>:<i>minutes</i>:<i>seconds</i>.<i>milliseconds</i>. * </p> * * @return the split time as a String * @since 2.1 */ public String toSplitString() { return DurationFormatUtils.formatDurationHMS(getSplitTime()); } /** * <p> * The method is used to find out if the StopWatch is started. A suspended * StopWatch is also started watch. * </p> * * @return boolean * If the StopWatch is started. * @since 3.2 */ public boolean isStarted() { return runningState.isStarted(); } /** * <p> * This method is used to find out whether the StopWatch is suspended. * </p> * * @return boolean * If the StopWatch is suspended. * @since 3.2 */ public boolean isSuspended() { return runningState.isSuspended(); } /** * <p> * This method is used to find out whether the StopWatch is stopped. The * stopwatch which’s not yet started and explicitly stopped stopwatch is * considered as stopped. * </p> * * @return boolean * If the StopWatch is stopped. * @since 3.2 */ public boolean isStopped() { return runningState.isStopped(); }}

寫法三(Scala函數寫法):

import org.slf4j.LoggerFactory/** * 類功能描述:Debug日志追蹤 * * @author barry create at 18-8-29 下午3:41 * @version 1.0.0 */object Debug { val LOGGER = LoggerFactory.getLogger(getClass) val counter = collection.mutable.Map[String, Int]() // label -> count val times = collection.mutable.Map[String, Long]() // label - time(ns) /** *追蹤代碼塊 * @param label 標簽名 * @param codeBlock 代碼塊 * @tparam T 返回結果類型 * @return */ def trace[T](label: String)(codeBlock: => T) = { val t0 = System.nanoTime() val result = codeBlock val t1 = System.nanoTime() counter.get(label).map(_counter => counter.put(label, _counter + 1)).orElse(counter.put(label, 1)) times.get(label).map(cost => times.put(label, cost + (t1 - t0))).orElse(times.put(label, t1 - t0)) result } /** * 打印日志 */ def info(): Unit = { LOGGER.warn('FinallyDone...') LOGGER.warn(s'counter:${counter}') LOGGER.warn(s'times:${times.map { case (label, cost) => (label, cost / 1000000)}}ms') } /** * 重新計數 */ def reset(): Unit = { counter.clear() times.clear() }}

參考下面測試代碼:

java版本:

/** * @author WangXueXing create at 19-7-31 下午1:46 * @version 1.0.0 */public class StopWatchDemo { public static void main(String[] args){ Debug.trace('方法1調用次數及用時', ()->{ try {Thread.sleep(2000); } catch (InterruptedException e) {e.printStackTrace(); } return ''; }); Debug.trace('方法1調用次數及用時', ()->{ try {Thread.sleep(2000); } catch (InterruptedException e) {e.printStackTrace(); } return ''; }); Debug.trace('方法2調用次數及用時', ()->{ try {Thread.sleep(2000); } catch (InterruptedException e) {e.printStackTrace(); } return 10; }); Debug.info(); }}

輸出結果:

15:29:32.228 [main] WARN test.Debug$ - FinallyDone...15:29:32.361 [main] WARN test.Debug$ - counter:Map(方法2調用次數及用時 -> 1, 方法1調用次數及用時 -> 2)15:29:32.364 [main] WARN test.Debug$ - times:Map(方法2調用次數及用時 -> 2000, 方法1調用次數及用時 -> 4000)ms

scala版本:

/** * @author WangXueXing create at 19-8-1 下午3:40 * @version 1.0.0 */object StopWatchTest { def main(args: Array[String]): Unit = { Debug.trace('方法1調用次數及用時')( Thread.sleep(200)) Debug.trace('方法1調用次數及用時')( Thread.sleep(200)) Debug.trace('方法2調用次數及用時')( Thread.sleep(200)) Debug.info() }}

輸出結果:

15:43:58.601 [main] WARN test.stopwatch.Debug$ - FinallyDone...15:43:58.735 [main] WARN test.stopwatch.Debug$ - counter:Map(方法2調用次數及用時 -> 1, 方法1調用次數及用時 -> 2)15:43:58.739 [main] WARN test.stopwatch.Debug$ - times:Map(方法2調用次數及用時 -> 200, 方法1調用次數及用時 -> 400)ms

對比java版本與scala版本,是不是看到scala的簡潔及強大了吧!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 在线视频91| 海外中文字幕在线观看 | 日韩一级免费在线观看 | 热久久久久 | 欧美成人一区二区三区片免费 | 久久黄色网 | 亚洲一区二区在线看 | 在线观看成人国产 | 亚洲精品国产剧情久久9191 | 国产亚洲精品精品国产亚洲综合 | 亚洲一区二区三区在线播放 | 成年视频在线观看福利资源 | 国产精品自拍视频网站 | 国产亚洲精品美女久久久久久久久久 | 一区二区三区中文字幕 | 看av网站 | 欧美精品 在线观看 | 99视频在线免费观看 | 午夜精品一区 | 国产在线中文字幕 | 久草网站 | 老司机深夜福利在线观看 | 日韩欧美一区二区视频 | 在线观看国产视频 | 欧美中文在线观看 | 亚州av| 91精品国产九九九久久久亚洲 | 99视频在线| 午夜精选视频 | 国内久久精品 | 久久久精品 | 另类视频在线 | 九九热在线视频 | 在线亚洲精品 | 四虎影院免费网址 | 福利视频一区二区 | 国产精品18hdxxxⅹ在线 | 欧美日韩国产在线观看 | 在线亚洲观看 | 精品国产乱码久久久久久1区2区 | 国产精品亚洲一区二区三区 | 精品免费视频 | 日韩精品一区二区三区在线观看 | 亚洲 欧美 激情 另类 校园 | 中文字幕二区 | 成人亚洲精品久久久久软件 | 一区二区三区精品 | 日本免费一区二区三区 | 日韩综合视频在线观看 | 97av| 91婷婷射 | a√天堂资源在线 | 黄色片在线免费看 | 狠狠躁日日躁夜夜躁东南亚 | 天天操天天干天天 | 成人av免费| 国产精品视频久久久 | 日韩有码在线播放 | 激情久久av一区av二区av三区 | 天天干夜夜爽 | 亚洲成人一区二区 | 精品日韩一区二区三区 | 国产馆一区二区 | 亚洲欧美日韩国产综合 | 欧美日韩激情一区二区三区 | 国产亚洲成av人片在线观看桃 | 最新国产福利在线 | 成年入口无限观看网站 | 在线亚洲一区 | 日韩在线高清视频 | 中文久久 | 天堂男人在线 | 久久99精品视频在线观看 | 亚洲精品久久 | 夜本色| 伊人久久一区二区三区 | 亚洲免费视频网站 | av在线免费观看一区二区 | 久久亚洲天堂 | 国产日韩欧美 | 国产综合亚洲精品一区二 | 国产精品一区二区久久 | 亚洲成人免费视频在线观看 | 亚洲精品成人在线 | 亚洲女人天堂av | 在线免费观看黄 | 亚洲一区二区在线 | 日本一区二区精品 | 国产精品日韩欧美一区二区三区 | 成人国产精品久久久 | 免费午夜电影 | 一区二区在线免费观看 | 91在线视频观看 | 精品久久国产 | 国产亚洲一区二区精品 | 黄网在线免费观看 | 欧美精品第一页 | 男人的天堂久久精品 | 免费午夜剧场 | 国产精品久久久久久福利一牛影视 | 丁香久久| 国产精品第2页 | 国产精品久久久久久久久 | 欧美三及片 | 欧美一级电影免费观看 | 天堂一区二区三区 | 精品久久久久久久久久久久 | 欧美亚洲另类在线 | 中文精品一区二区三区 | 欧美日韩91| 欧美99| 久操成人 | 久国产 | 国产成人精品一区二区 | 天天av网| 男人天堂视频网 | 日韩性精品 | av网站免费在线观看 | 97av在线 | 日本精品一区二区三区视频 | 亚洲成人免费视频在线观看 | 青青草免费在线视频 | 亚洲欧洲一区二区 | 黄在线看v | 一区二区三区国产精品 | 尤物视频在线观看 | 精品美女久久久 | 免费小视频 | 777xacom| 久色| 精品欧美一区二区三区久久久 | 久久久www成人免费精品 | 91在线精品一区二区 | av一区二区三区四区 | 国产综合视频在线播放 | 欧美一级欧美三级在线观看 | 爱爱视频免费 | 天堂亚洲| 天堂福利影院 | 荷兰欧美一级毛片 | 日韩精品一区二 | 日韩欧美在线播放 | 国产视频精品一区二区三区 | 成人免费crm一区二区 | 亚洲精品久久久久久久久久久久久 | 亚洲处破女 | ririsao亚洲国产中文 | a免费在线观看 | 狠狠躁夜夜躁人人爽视频 | 久久亚洲一区 | 久在线视频 | 久久久精品久久久久 | 成人免费的视频 | 国产精品免费一区二区 | 亚洲精品久久久一区二区三区 | 久久99这里只有精品 | av免费在线观看网站 | 伊人网影院 | 精品无人乱码一区二区三区 | 国产福利一区二区 | 国产超碰人人模人人爽人人添 | 品久久久久久久久久96高清 | 国产精品免费av | 日韩欧美在线视频 | 成人午夜在线 | 国产精品96久久久久久久 | 亚洲免费视频网站 | 仙人掌旅馆在线观看 | 久久精品日产高清版的功能介绍 | 日韩一区二区三区福利视频 | 四虎影音 | 欧美日本韩国一区二区三区 | 高清av网址 | 91福利网站在线观看 | 天天干狠狠 | av资源首页| 亚洲毛片| 精品在线一区二区 | 搜索黄色毛片 | 国产精品久久久久久久美男 | 久久视频精品 | 久久精品中文字幕一区 | 日本中文字幕在线观看 | 成人片网址 | 国产精品成人国产乱一区 | 天天干国产 | 91人人看 | 碰碰视频 | 亚洲国产激情 | 久久99久| 一区二区三区四区不卡视频 | 九九热欧美 | 国产乱淫av片 | www.亚洲一区 | 成人在线三级 | 精品久久久久国产免费 | 久久精品视| 久久久久久久一区二区 | 欧美黄色片 | 久草热8精品视频在线观看 亚洲区在线 | 欧美视频二区 | 毛片免费观看 | sese综合 | 成人看的羞羞视频免费观看 | 国产99久久精品 | 精品久久久久久国产 | 谁有毛片 | 成人免费一区二区三区视频网站 | 日日爽夜夜操 | 在线天堂视频 | 成人免费视频网 | 国产精品不卡视频 | 激情999| 电影91久久久 | 国产高清在线 | 日韩精品久久久久 | 黑色丝袜脚足j国产在线看68 | 亚洲a在线观看 | 久久精av| 黄免费观看 | 人人插| 久久久久久亚洲精品 | 91久久| www.涩涩视频 | 91精品国产综合久久久久久丝袜 | 在线视频一区二区三区 | 精品一区不卡 | 久草免费在线视频 | 成人免费在线播放 | 日韩精品成人 | 欧美日韩国产在线播放 | 精品欧美一区二区三区久久久 | 免费av电影网站 | 日韩精品久久久久久 | 国产91久久精品一区二区 | 亚洲在线免费观看 | 国内自拍偷拍视频 | 天天干天天草 | 欧美aⅴ| 日韩特黄一级欧美毛片特黄 | 亚洲午夜精品 | 一级黄色录像在线观看 | 久久伊99综合婷婷久久伊 | av av在线 | 亚洲精品在线视频 | 欧美精品中文字幕久久二区 | 国产精品国产三级国产a | 一区二区视频 | 精品国产三级a在线观看 | 亚洲精品在 | 日韩国产精品一区二区三区 | 亚洲精品三级 | 亚洲精品一区二区在线 | 久久久久国产 | 久久精品国产免费 | 久久99精品久久久久久琪琪 | 欧美精品在线一区二区三区 | 国产婷婷在线视频 | 日韩成人在线网站 | 日韩不卡在线 | 欧美成人激情视频 | 久久精品一区二区三区四区 | 久久久精品网 | 国产精品99久久久久久久vr | 日韩天堂 | 精品久久一二三区 | 日韩精品在线网站 | 在线一区二区免费 | 精品成人 | 久久av综合 | 在线视频中文字幕 | 国产精品久久久av | 午夜毛片| www免费网站在线观看 | 四虎影院免费看 | 精品国产乱码久久久久久88av | 国产日韩欧美91 | 欧美黄色一区 | 国产裸体永久免费视频网站 | 一级激情片 | a级在线观看免费 | 久久精品国产91精品亚洲高清 | av免费网站在线观看 | 国产午夜精品一区二区三区 | 羞羞视频在线观免费观看 | 二区在线观看 | 午夜免费视频福利 | 日韩不卡在线 | 国产麻豆乱码精品一区二区三区 | 欧美成人一区二区三区片免费 | 国产综合精品一区二区三区 | 日韩专区一区二区三区 | 欧美精品久久久 | 成人福利影院 | 精品乱子伦一区二区三区 | 精品日韩一区二区 | 啪啪的网站 | 日本激情在线 | 欧美天天 | 91精品一区二区三区久久久久久 | 日韩在线成人 | 欧美日韩一级在线观看 | 色久天堂 | 久久精品美女 | 久久精品国产一区 | 亚洲精品欧美精品 | 欧美日视频 | 色综合88| 在线视频a| 在线视频亚洲 | 国产精品久久久久久久午夜 | 中文字字幕在线观看 | 黄色片网站视频 | 正在播放国产一区 | 欧美成人精品一区二区三区 | 欧美成人精品一区二区男人看 | 九九国产精品视频 | 国产成人免费视频网站高清观看视频 | 国产一区二区自拍视频 | 精品成人 | 国产精品18 | 91视频18| 四色成人av永久网址 | 中文字幕在线一区 | 欧美一区二区三区视频在线观看 | 狠狠操狠狠干 | 欧美亚洲综合久久 | 亚洲欧美一区二区三区在线 | 在线中文av | 午夜电影网址 | 欧美日韩亚洲二区 | 国产精品成人国产乱一区 | 亚洲一级一片 | 欧美精品一区二区蜜臀亚洲 | 中文字幕在线观看网站 | 欧美激情自拍偷拍 | 中文欧美日韩 | 久久精品麻豆 | 免费在线一区二区三区 | 国产精品久久久久久久娇妻 | 热久久这里只有精品 | 色婷婷综合久色 | 亚洲狠狠爱一区二区三区 | 日韩高清一区二区 | av免费观看网站 | 韩日在线观看视频 | 亚洲乱码在线 | 99在线免费观看 | 久久精品视频网站 | 中文字国产精久久无 | 欧美成视频| 99国产精品久久久久久久久久 | 久久久久精 | 精品国产乱码久久久久久久软件 | 欧美国产日韩另类 | 精品日韩一区二区 | 天天干天天草 | 男女视频在线观看 | 国产精品久久久久久亚洲调教 | 中文字幕在线第一页 | 黄色av网站在线观看 | av一区二区在线观看 | 精品亚洲成a人在线观看 | 欧美专区在线观看 | 黄色一级视频 | 精品一区免费观看 | 麻豆沈芯语在线观看 | 爱草在线 | 影音先锋中文字幕在线 | 99av| 91在线看视频| 久久精品91 | 成人在线观看网站 | 国产成人一区二区三区 | 色网在线 | 国产不卡一区 | 国产亚洲精品久久久优势 | 成人免费在线看片 | 99精品免费 | 亚洲人黄色片 | 国产伊人久 | 99精品电影 | 日本xxww视频免费 | 国产欧美一区二区精品久久 | h视频网站在线 | 国产日韩中文字幕 | 亚洲一区二区三区高清 | 中文字幕国产 | 久久国产久 | 日本中文字幕在线观看 | 91麻豆精品久久久久蜜臀 | 999久久久久久久久 国产欧美在线观看 | 女人夜夜春 | 亚洲高清视频一区二区三区 | 国产精品毛片久久久久久久 | 日韩欧美精品一区二区三区 | 日本爽快片毛片 | 日本在线视 | 天天干天天爽 | 精品国偷自产在线 | 日本色道视频 | 欧美成人精品在线观看 | 九九热这里 | 国产xxxx成人精品免费视频频 | 一区二区三区有限公司 | 精品国产黄a∨片高清在线 99热婷婷 | 日韩欧美在线视频 | 日本三级在线观看中文字 | 四虎成人在线 | 国产一区二区自拍视频 | 久久久久国产精品免费免费搜索 | 欧美激情国产日韩精品一区18 | 欧美黄色一级毛片 | 精品99久久 | 午夜久久久久 | 午夜精品久久久久 | 密色视频| 亚洲欧美精品 | 欧美极品视频 | 午夜影视av | 免费国产一区 | 久草成人网| 亚洲激情av| 毛片国产 | 看毛片网站 | 成人免费网站在线观看 | 欧美一区在线看 | 国产成人精品午夜 | 99免费在线播放99久久免费 | 成人精品电影 | 色先锋av资源中文字幕 | 女人夜夜春高潮爽av片 | 亚洲国产成人av好男人在线观看 | 黄色高清视频在线观看 | 中文字幕av网 | 欧美区国产区 | 亚洲欧美在线一区二区 | 国产精品s色 | 国产精品免费看 | 91精品国产色综合久久不卡98口 | 亚洲激情av| 成人免费淫片aa视频免费 | 国产无区一区二区三麻豆 | 亚洲一区二区三区视频 | 国产人妖一区二区 | 另类久久 | 午夜在线观看 | 99热首页| 在线免费国产视频 | 国产精品欧美一区二区三区不卡 | se69色成人网wwwsex | 激情久久av一区av二区av三区 | 欧美激情精品久久久久 | 国产一区二区三区视频 | 97人人做人人人难人人做 | 在线免费中文字幕 | 亚洲经典视频在线观看 | 国产精品美女在线观看 | 91在线精品秘密一区二区 | 91精品午夜 | 国产专区在线视频 | 国产亚洲精品久久久久久久 | 欧美精品一| 日韩成人在线一区 | 久久中文字幕一区 | 国产精品一区二区三区99 | 电影午夜精品一区二区三区 | 欧美成人a∨高清免费观看 在线视频成人 | 成人a视频在线观看 | 亚洲日本乱码一区两区在线观看 | 日本在线视频中文字幕 | 理伦影院 | 最近免费中文字幕大全免费版视频 | 永久黄网站色视频免费 | 欧美国产一区二区三区 | 亚洲欧洲精品在线 | 日韩中文一区二区三区 | 网站一区二区三区 | 免费观看国产精品 | 国产在线观看一区二区三区 | 中文字幕免费在线观看视频 | 国产精品第52页 | 亚洲第一国产精品 | 亚洲国产二区 | 精品国产一区二区三区性色av | 欧美激情一区二区三区在线观看 | 亚洲人成在线播放 | 日日网| 97色综合 | 久久人人爽人人爽人人片av软件 | 毛片视频观看 | 日韩成人国产 | 91麻豆精品国产91久久久资源速度 | 免费国产一区 | 亚洲国产精品网站 | 91久色 | 亚洲大片免费观看 | 精品国产一区二区三区免费 | 亚洲欧美国产一区二区三区 | 中出片 | a欧美| 欧美一区三区 | 精品视频久久 | 欧美日韩精品网站 | 国产精品无码久久久久 | 成人午夜 | 色婷婷综合久久久中文字幕 | 国产成人在线视频 | 日韩综合 | 一本大道久久a久久精二百 亚洲欧美高清 | 亚洲精品一| 99国产精品99久久久久久 | 区一区二区三在线观看 | 国产精品成av人在线视午夜片 | 福利片在线| 久久激情综合 | 日韩中文字幕一区二区 | 中文字幕在线第一页 | 一区二区三区自拍 | 成人精品网 | 精品国产乱码一区二区三区四区 | 九九综合九九 | 麻豆网址| 91精品国产综合久久久久久丝袜 | 国产欧美日韩 | 亚洲国产精品99久久久久久久久 | 美女一区二区三区四区 | 黄色国产在线看 | 国产亚洲网站 | 中文字幕日韩在线 | 精品一区二区三区国产 | 亚洲高清资源 | 男女做爰高清无遮挡免费视频 | 国产精品自产av一区二区三区 | 精品久久久久久久久久久院品网 | 中文在线亚洲 | 在线日韩成人 | 欧美激情国产日韩精品一区18 | 欧美日韩一区二区三区在线观看 | 国产伦精品一区二区三区照片91 | 91成人在线免费视频 | 黄色片com| 欧美日韩视频在线播放 | 欧美在线a| 狠狠影院 | 精品一区二区三区免费 | 日韩在线欧美 | 亚洲一区久久久 | 无套内谢孕妇毛片免费看红桃影视 | 国产成人福利 | 国产日韩欧美在线观看 | 国产精品美女久久久久久免费 | 欧美性一区二区 | 欧美一区二区三区免费观看视频 | 日韩不卡在线 | 国产精品久久久久久久久久三级 | 欧美性视频网站 | 国产精品一区二区三区四区 | 91高清在线 | 羞羞的视频网站 | 亚洲一区在线视频 | 欧美成人精品一区二区三区在线看 | 国产男女视频在线观看 | 自拍偷拍视频网站 | 一级篇 | 日韩精品一区二区三区在线观看 | 国产电影一区二区三区图片 | 成年人精品视频在线观看 | 色综合天天综合网国产成人网 | 国产精品久久嫩一区二区 免费 | 日韩精品久久久久 | 精品中文字幕在线观看 | 国产精品美女视频 | 日韩成人小视频 | 伊人影视 | 91.成人天堂一区 | 国产精品永久久久久久久久久 | 国产资源视频在线观看 | 日韩超级大片免费看国产国产播放器 | 国模一区二区三区 | 亚洲人成人一区二区在线观看 | 黄色小视频在线观看 | 草比网站 | 成人看的羞羞视频免费观看 | 一级毛片在线免费看 | 91极品在线 | 色爱av| 成年人视频在线免费观看 | 91精品久久 | 中文字幕视频在线免费观看 | 日韩中文字幕一区二区 | 高清av网站 | 狠狠干av | 一区二区精品视频 | 日韩电影专区 | 国产精品久久久久久久9999 | 91精品国产综合久久久久久蜜臀 | 久久免费视频观看 | 在线观看免费av电影 | 久国产精品视频 | 欧美精品导航 | 欧美一区二区三区在线视频 | 视频一区在线播放 | 噜噜噜在线视频 | 午夜tv| 91在线视频播放 | 国产一级在线观看 | 色噜噜一区二区 | 91精品国产综合久久久亚洲 | 日日操夜| 一区二区在线视频 | 久久久国产精品视频 | 日韩欧美在线视频观看 | 日韩中文一区二区三区 | 日韩激情视频一区二区 |